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(); }
public void testFilenameListWithAppendedIndex() { MultifileOptions options = new MultifileOptions(); options.FormatPattern = "*$J(.)"; options.MaxDayTry = 66; LinkedList<string> files = CreateTestfilesWithoutDate(); string firstFile = files.Last.Value; ILogFileInfo info = new LogFileInfo(new Uri(firstFile)); RolloverFilenameHandler handler = new RolloverFilenameHandler(info, options); LinkedList<string> fileList = handler.GetNameList(); Assert.AreEqual(files, fileList); Cleanup(); }
public void testFilenameListWithAppendedIndex() { MultifileOptions options = new MultifileOptions(); options.FormatPattern = "*$J(.)"; options.MaxDayTry = 66; LinkedList <string> files = CreateTestfilesWithoutDate(); string firstFile = files.Last.Value; ILogFileInfo info = new LogFileInfo(new Uri(firstFile)); RolloverFilenameHandler handler = new RolloverFilenameHandler(info, options); LinkedList <string> fileList = handler.GetNameList(); Assert.AreEqual(files, fileList); Cleanup(); }
/// <summary> /// Public for unit tests. /// </summary> /// <returns></returns> public int ShiftBuffers() { Logger.logInfo(string.Format("ShiftBuffers() begin for {0}{1}", _fileName, IsMultiFile ? " (MultiFile)" : "")); AcquireBufferListWriterLock(); int offset = 0; _isLineCountDirty = true; lock (monitor) { RolloverFilenameHandler rolloverHandler = new RolloverFilenameHandler(_watchedILogFileInfo, _mutlifileOptions); LinkedList<string> fileNameList = rolloverHandler.GetNameList(); ResetBufferCache(); IList<ILogFileInfo> lostILogFileInfoList = new List<ILogFileInfo>(); IList<ILogFileInfo> readNewILogFileInfoList = new List<ILogFileInfo>(); IList<ILogFileInfo> newFileInfoList = new List<ILogFileInfo>(); IEnumerator<ILogFileInfo> enumerator = _logFileInfoList.GetEnumerator(); while (enumerator.MoveNext()) { ILogFileInfo logFileInfo = enumerator.Current; string fileName = logFileInfo.FullName; Logger.logDebug(string.Format("Testing file {0}", fileName)); LinkedListNode<string> node = fileNameList.Find(fileName); if (node == null) { Logger.logWarn(string.Format("File {0} not found", fileName)); continue; } if (node.Previous != null) { fileName = node.Previous.Value; ILogFileInfo newILogFileInfo = GetLogFileInfo(fileName); Logger.logDebug(string.Format("{0} exists", fileName)); Logger.logDebug(string.Format("Old size={0}, new size={1}", logFileInfo.OriginalLength, newILogFileInfo.Length)); // is the new file the same as the old buffer info? if (newILogFileInfo.Length == logFileInfo.OriginalLength) { ReplaceBufferInfos(logFileInfo, newILogFileInfo); newFileInfoList.Add(newILogFileInfo); } else { Logger.logDebug(string.Format("Buffer for {0} must be re-read.", fileName)); // not the same. so must read the rest of the list anew from the files readNewILogFileInfoList.Add(newILogFileInfo); while (enumerator.MoveNext()) { fileName = enumerator.Current.FullName; node = fileNameList.Find(fileName); if (node == null) { Logger.logWarn(string.Format("File {0} not found", fileName)); continue; } if (node.Previous != null) { fileName = node.Previous.Value; Logger.logDebug(string.Format("New name is {0}", fileName)); readNewILogFileInfoList.Add(GetLogFileInfo(fileName)); } else { Logger.logWarn(string.Format("No previous file for {0} found", fileName)); } } } } else { Logger.logInfo(string.Format("{0} does not exist", fileName)); lostILogFileInfoList.Add(logFileInfo); #if DEBUG // for better overview in logfile: //ILogFileInfo newILogFileInfo = new ILogFileInfo(fileName); //ReplaceBufferInfos(ILogFileInfo, newILogFileInfo); #endif } } if (lostILogFileInfoList.Count > 0) { Logger.logInfo("Deleting buffers for lost files"); foreach (ILogFileInfo ILogFileInfo in lostILogFileInfoList) { //ILogFileInfoList.Remove(ILogFileInfo); LogBuffer lastBuffer = DeleteBuffersForInfo(ILogFileInfo, false); if (lastBuffer != null) { offset += lastBuffer.StartLine + lastBuffer.LineCount; } } _lruCacheDictLock.AcquireWriterLock(Timeout.Infinite); Logger.logInfo(string.Format("Adjusting StartLine values in {0} buffers by offset {1}", _bufferList.Count, offset)); foreach (LogBuffer buffer in _bufferList) { SetNewStartLineForBuffer(buffer, buffer.StartLine - offset); } _lruCacheDictLock.ReleaseWriterLock(); #if DEBUG if (_bufferList.Count > 0) { Logger.logInfo(string.Format("First buffer now has StartLine {0}", _bufferList[0].StartLine)); } #endif } // Read anew all buffers following a buffer info that couldn't be matched with the corresponding existing file Logger.logInfo("Deleting buffers for files that must be re-read"); foreach (ILogFileInfo ILogFileInfo in readNewILogFileInfoList) { DeleteBuffersForInfo(ILogFileInfo, true); //ILogFileInfoList.Remove(ILogFileInfo); } Logger.logInfo("Deleting buffers for the watched file"); DeleteBuffersForInfo(_watchedILogFileInfo, true); int startLine = LineCount - 1; Logger.logInfo("Re-Reading files"); foreach (ILogFileInfo ILogFileInfo in readNewILogFileInfoList) { //ILogFileInfo.OpenFile(); ReadToBufferList(ILogFileInfo, 0, LineCount); //ILogFileInfoList.Add(ILogFileInfo); newFileInfoList.Add(ILogFileInfo); } //watchedILogFileInfo = ILogFileInfoList[ILogFileInfoList.Count - 1]; _logFileInfoList = newFileInfoList; _watchedILogFileInfo = GetLogFileInfo(_watchedILogFileInfo.FullName); _logFileInfoList.Add(_watchedILogFileInfo); Logger.logInfo("Reading watched file"); ReadToBufferList(_watchedILogFileInfo, 0, LineCount); } Logger.logInfo(string.Format("ShiftBuffers() end. offset={0}", offset)); ReleaseBufferListWriterLock(); return offset; }