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); }
protected override void OnReceive(object message) { switch (message) { case ReadLineFromFileActorMessages.ReadLineFromFileStartingAtByte readLineFromFileMessage: { ReturnedLine returnedLine = ReadLineFromFile(readLineFromFileMessage); _delimitLogLineActor.Tell(new DelimitLogLineActorMessages.DelimitLogLineMessage(returnedLine)); break; } } }
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; }