public LogfileReader(string fileName, EncodingOptions encodingOptions, bool multiFile, int bufferCount, int linesPerBuffer, MultifileOptions mutlifileOptions) { if (fileName == null) { return; } _fileName = fileName; EncodingOptions = encodingOptions; _isMultiFile = multiFile; MAX_BUFFERS = bufferCount; MAX_LINES_PER_BUFFER = linesPerBuffer; _mutlifileOptions = mutlifileOptions; InitLruBuffers(); if (multiFile) { ILogFileInfo info = GetLogFileInfo(fileName); RolloverFilenameHandler rolloverHandler = new RolloverFilenameHandler(info, _mutlifileOptions); LinkedList<string> nameList = rolloverHandler.GetNameList(); ILogFileInfo fileInfo = null; foreach (string name in nameList) { fileInfo = AddFile(name); } _watchedILogFileInfo = fileInfo; // last added file in the list is the watched file } else { _watchedILogFileInfo = AddFile(fileName); } StartGCThread(); }
private void compareReaderImplementations(string fileName, Encoding enc) { string DataPath = "..\\..\\data\\"; EncodingOptions encOpts = new EncodingOptions(); encOpts.Encoding = enc; Stream s1 = new FileStream(DataPath + fileName, FileMode.Open, FileAccess.Read); PositionAwareStreamReader r1 = new PositionAwareStreamReader(s1, encOpts, false); Stream s2 = new FileStream(DataPath + fileName, FileMode.Open, FileAccess.Read); PositionAwareStreamReader r2 = new PositionAwareStreamReader(s2, encOpts, true); for (int lineNum = 0; ; lineNum++) { string line1 = r1.ReadLine(); string line2 = r2.ReadLine(); if (line1 == null && line2 == null) { break; } Assert.AreEqual(line1, line2, "File " + fileName); Assert.AreEqual(r1.Position, r2.Position, "Zeile " + lineNum + ", File: " + fileName); } }
public PositionAwareStreamReader(Stream stream, EncodingOptions encodingOptions, bool useSystemReaderMethod) { this.useSystemReaderMethod = useSystemReaderMethod; this.stream = new BufferedStream(stream); this.preambleLength = DetectPreambleLengthAndEncoding(); Encoding usedEncoding; if (this.detectedEncoding != null && encodingOptions.Encoding == null) { usedEncoding = this.detectedEncoding; } else if (encodingOptions.Encoding != null) { usedEncoding = encodingOptions.Encoding; } else { usedEncoding = encodingOptions.DefaultEncoding != null ? encodingOptions.DefaultEncoding : Encoding.Default; } if (usedEncoding is System.Text.UTF8Encoding) posInc_precomputed = 0; else if (usedEncoding is System.Text.UnicodeEncoding) posInc_precomputed = 2; else posInc_precomputed = 1; this.reader = new StreamReader(this.stream, usedEncoding, true); ResetReader(); Position = 0; if (this.useSystemReaderMethod) { this.newLineSequenceLength = guessNewLineSequenceLength(); } }
public LogfileReader(string[] fileNames, EncodingOptions encodingOptions, int bufferCount, int linesPerBuffer, MultifileOptions mutlifileOptions) { if (fileNames == null || fileNames.Length < 1) { return; } EncodingOptions = encodingOptions; _isMultiFile = true; MAX_BUFFERS = bufferCount; MAX_LINES_PER_BUFFER = linesPerBuffer; _mutlifileOptions = mutlifileOptions; InitLruBuffers(); ILogFileInfo fileInfo = null; foreach (string name in fileNames) { fileInfo = AddFile(name); } _watchedILogFileInfo = fileInfo; _fileName = fileInfo.FullName; StartGCThread(); }
private void LoadFilesAsMultiInternal(string[] fileNames, EncodingOptions encodingOptions) { Logger.logInfo("Loading given files as MultiFile:"); EnterLoadFileStatus(); foreach (string name in fileNames) { Logger.logInfo("File: " + name); } if (CurrentLogFileReader != null) { CurrentLogFileReader.stopMonitoring(); UnRegisterLogFileReaderEvents(); } EncodingOptions = encodingOptions; _columnCache = new ColumnCache(); CurrentLogFileReader = new LogfileReader( fileNames, EncodingOptions, Preferences.bufferCount, Preferences.linesPerBuffer, _multifileOptions); CurrentLogFileReader.UseNewReader = !Preferences.useLegacyReader; RegisterLogFileReaderEvents(); CurrentLogFileReader.startMonitoring(); FileName = fileNames[fileNames.Length - 1]; _fileNames = fileNames; IsMultiFile = true; }
private void LoadFileInternal(string fileName, EncodingOptions encodingOptions) { EnterLoadFileStatus(); if (fileName != null) { FileName = fileName; EncodingOptions = encodingOptions; if (CurrentLogFileReader != null) { CurrentLogFileReader.StopMonitoringAsync(); UnRegisterLogFileReaderEvents(); } if (!LoadPersistenceOptions()) { if (!IsTempFile) { ILogLineColumnizer columnizer = FindColumnizer(); if (columnizer != null) { if (_reloadMemento == null) { columnizer = Util.CloneColumnizer(columnizer); } } PreSelectColumnizer(columnizer); } SetDefaultHighlightGroup(); } // this may be set after loading persistence data if (_fileNames != null && IsMultiFile) { LoadFilesAsMulti(_fileNames, EncodingOptions); return; } _columnCache = new ColumnCache(); try { CurrentLogFileReader = new LogfileReader( fileName, EncodingOptions, IsMultiFile, Preferences.bufferCount, Preferences.linesPerBuffer, _multifileOptions); CurrentLogFileReader.UseNewReader = !Preferences.useLegacyReader; } catch (LogFileException lfe) { MessageBox.Show("Cannot load file\n" + lfe.Message, "LogExpert"); BeginInvoke(new Action<bool>(Close), new object[] { true }); _isLoadError = true; return; } ILogLineXmlColumnizer xmlColumnizer = CurrentColumnizer as ILogLineXmlColumnizer; if (xmlColumnizer != null) { CurrentLogFileReader.IsXmlMode = true; CurrentLogFileReader.XmlLogConfig = xmlColumnizer.GetXmlLogConfiguration(); } if (_forcedColumnizerForLoading != null) { CurrentColumnizer = _forcedColumnizerForLoading; } IPreProcessColumnizer preProcessColumnizer = CurrentColumnizer as IPreProcessColumnizer; if (CurrentColumnizer is IPreProcessColumnizer) { CurrentLogFileReader.PreProcessColumnizer = preProcessColumnizer; } else { CurrentLogFileReader.PreProcessColumnizer = null; } RegisterLogFileReaderEvents(); Logger.logInfo("Loading logfile: " + fileName); CurrentLogFileReader.startMonitoring(); } }
public void LoadFilesAsMulti(string[] fileNames, EncodingOptions encodingOptions) { LoadFilesAsMultiInternal(fileNames, encodingOptions); }
public void LoadFile(string fileName, EncodingOptions encodingOptions) { LoadFileInternal(fileName, encodingOptions); }
public void testShiftBuffers1() { int linesPerFile = 10; MultifileOptions options = new MultifileOptions(); options.MaxDayTry = 0; options.FormatPattern = "*$J(.)"; LinkedList<string> files = CreateTestfilesWithoutDate(); EncodingOptions encodingOptions = new EncodingOptions(); encodingOptions.Encoding = Encoding.Default; LogfileReader reader = new LogfileReader(files.Last.Value, encodingOptions, true, 40, 50, options); reader.ReadFiles(); IList<ILogFileInfo> lil = reader.GetLogFileInfoList(); Assert.AreEqual(files.Count, lil.Count); LinkedList<string>.Enumerator enumerator = files.GetEnumerator(); enumerator.MoveNext(); foreach (LogFileInfo li in lil) { string fileName = enumerator.Current; Assert.AreEqual(fileName, li.FullName); enumerator.MoveNext(); } int oldCount = lil.Count; // Simulate rollover // files = RolloverSimulation(files, "*$J(.)", false); // Simulate rollover detection // reader.ShiftBuffers(); lil = reader.GetLogFileInfoList(); Assert.AreEqual(oldCount + 1, lil.Count); Assert.AreEqual(linesPerFile * lil.Count, reader.LineCount); // Check if rollover'd file names have been handled by LogfileReader // Assert.AreEqual(files.Count, lil.Count); enumerator = files.GetEnumerator(); enumerator.MoveNext(); foreach (LogFileInfo li in lil) { string fileName = enumerator.Current; Assert.AreEqual(fileName, li.FullName); enumerator.MoveNext(); } // Check if file buffers have correct files. Assuming here that one buffer fits for a // complete file // enumerator = files.GetEnumerator(); enumerator.MoveNext(); IList<LogBuffer> logBuffers = reader.GetBufferList(); int startLine = 0; foreach (LogBuffer logBuffer in logBuffers) { Assert.AreEqual(logBuffer.FileInfo.FullName, enumerator.Current); Assert.AreEqual(startLine, logBuffer.StartLine); startLine += 10; enumerator.MoveNext(); } // Checking file content // enumerator = files.GetEnumerator(); enumerator.MoveNext(); enumerator.MoveNext(); // move to 2nd entry. The first file now contains 2nd file's content (because rollover) logBuffers = reader.GetBufferList(); int i; for (i = 0; i < logBuffers.Count - 2; ++i) { LogBuffer logBuffer = logBuffers[i]; string line = logBuffer.GetLineOfBlock(0); Assert.IsTrue(line.Contains(enumerator.Current)); enumerator.MoveNext(); } enumerator.MoveNext(); // the last 2 files now contain the content of the previously watched file for (; i < logBuffers.Count; ++i) { LogBuffer logBuffer = logBuffers[i]; string line = logBuffer.GetLineOfBlock(0); Assert.IsTrue(line.Contains(enumerator.Current)); } oldCount = lil.Count; // Simulate rollover again - now latest file will be deleted (simulates logger's rollover history limit) // files = RolloverSimulation(files, "*$J(.)", true); // Simulate rollover detection // reader.ShiftBuffers(); lil = reader.GetLogFileInfoList(); Assert.AreEqual(oldCount, lil.Count); // same count because oldest file is deleted Assert.AreEqual(files.Count, lil.Count); Assert.AreEqual(linesPerFile * lil.Count, reader.LineCount); // Check first line to see if buffers are correct // string firstLine = reader.GetLogLine(0); string[] names = new string[files.Count]; files.CopyTo(names, 0); Assert.IsTrue(firstLine.Contains(names[2])); }
private ILogStreamReader GetLogStreamReader(Stream stream, EncodingOptions encodingOptions, bool useNewReader) { if (IsXmlMode) { return new XmlBlockSplitter(new XmlLogReader(new PositionAwareStreamReader(stream, encodingOptions, useNewReader)), XmlLogConfig); } else { return new PositionAwareStreamReader(stream, encodingOptions, useNewReader); } }