예제 #1
0
		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();
		}
예제 #2
0
 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();
 }
예제 #3
0
        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();
        }
예제 #4
0
		/// <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;
		}