Esempio n. 1
0
        private ReturnedLine ReadLineFromByteChunk(byte[] bytesToRead, ReturnedLine lineRead)
        {
            for (int i = 0; i < bytesToRead.Length; i++)
            {
                lineRead.LineEndsAtByteLocation++;
                byte b = bytesToRead[i];

                if (b == ProgramConfig.NullByte)
                {
                    continue;
                }

                if (b != ProgramConfig.LineFeedByte)
                {
                    char currentByte = Convert.ToChar(b);
                    lineRead.Line += currentByte;
                    continue;
                }

                lineRead.CompletedRead = true;
                break;
            }

            return(lineRead);
        }
Esempio n. 2
0
 protected override void OnReceive(object message)
 {
     switch (message)
     {
     case ReadLineFromFileActorMessages.ReadLineFromFileStartingAtByte readLineFromFileMessage:
     {
         ReturnedLine returnedLine = ReadLineFromFile(readLineFromFileMessage);
         _delimitLogLineActor.Tell(new DelimitLogLineActorMessages.DelimitLogLineMessage(returnedLine));
         break;
     }
     }
 }
Esempio n. 3
0
        private ReturnedLine ReadLineFromFile(ReadLineFromFileActorMessages.ReadLineFromFileStartingAtByte message)
        {
            string filePath = message.FilePath;

            if (!File.Exists(filePath))
            {
                return(null);
            }

            long fileSizeInBytes     = new FileInfo(filePath).Length;
            long chunkStartingAtByte = message.StartingByteNumber;

            byte[]       buffer   = new byte[ProgramConfig.ChunkSize];
            ReturnedLine lineRead = new ReturnedLine
            {
                Line = string.Empty,
                LineEndsAtByteLocation   = chunkStartingAtByte,
                LineStartsAtByteLocation = message.StartingByteNumber,
                CompletedRead            = false,
                FilePath = message.FilePath
            };

            using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read))
            {
                while (!lineRead.CompletedRead &&
                       chunkStartingAtByte < fileSizeInBytes)
                {
                    fileStream.Seek(Convert.ToInt32(chunkStartingAtByte), SeekOrigin.Begin);
                    fileStream.Read(buffer, 0, ProgramConfig.ChunkSize);
                    lineRead             = ReadLineFromByteChunk(buffer, lineRead);
                    chunkStartingAtByte += lineRead.LineEndsAtByteLocation;
                }

                if (!lineRead.CompletedRead)
                {
                    lineRead.LastLine = lineRead.CompletedRead = true;
                }
            }

            return(lineRead);
        }
        private DelimitedLogLine CreateDelimitedLogLineFromReturnedLine(ReturnedLine returnedLine)
        {
            string rawLine = returnedLine.Line;

            List <LogLineField> individualFields = new List <LogLineField>();

            DelimitedLogLine delimitedLogLine = new DelimitedLogLine
            {
                RawLine  = rawLine,
                FilePath = returnedLine.FilePath,
                LineStartsAtByteLocation = returnedLine.LineStartsAtByteLocation,
                LineEndsAtByteLocation   = returnedLine.LineEndsAtByteLocation
            };

            int i = 0;

            if (rawLine.Contains(_appenderLayout.Header) ||
                rawLine.Contains(_appenderLayout.Footer) ||
                string.IsNullOrWhiteSpace(rawLine))
            {
                foreach (LogLineField field in _appenderLayout.ConversionPattern.Fields)
                {
                    string content = field.Name == "Message" ? rawLine : string.Empty;

                    individualFields.Add(new LogLineField
                    {
                        Name    = field.Name,
                        Content = content
                    });
                }
            }
            else
            {
                try
                {
                    foreach (LogLineField field in _appenderLayout.ConversionPattern.Fields)
                    {
                        if (field.Type == LogLineType.FixedWidth)
                        {
                            individualFields.Add(new LogLineField {
                                Name    = field.Name,
                                Content = rawLine.Substring(i, field.FixedWidth).Trim(),
                            });

                            i += field.FixedWidth;
                        }
                        else if (field.Type == LogLineType.Delimited)
                        {
                            int startPos    = field.MinWidth + i;
                            int fieldEndPos = rawLine.IndexOf(field.EndingCharacter, startPos);

                            if (fieldEndPos == i)
                            {
                                fieldEndPos = rawLine.Length;
                            }

                            int fieldLength = fieldEndPos - i;

                            individualFields.Add(new LogLineField {
                                Name    = field.Name,
                                Content = rawLine.Substring(i, fieldLength).Trim()
                            });

                            i += fieldLength;
                        }
                    }
                }
                catch
                {
                    individualFields.Clear();

                    foreach (LogLineField field in _appenderLayout.ConversionPattern.Fields)
                    {
                        string content = field.Name == "Message" ? rawLine : string.Empty;

                        individualFields.Add(new LogLineField
                        {
                            Name    = field.Name,
                            Content = content
                        });
                    }
                }
            }

            delimitedLogLine.Fields = individualFields;

            return(delimitedLogLine);
        }
 public DelimitLogLineMessage(ReturnedLine returnedLine)
 {
     ReturnedLine = returnedLine;
 }