/// <summary> /// Determines whether the <see cref="ReceiverBase"/> instance can handle the given file name as log file. /// </summary> /// <returns><c>True</c> if the file can be handled, otherwise <c>false</c>.</returns> public override bool CanHandleLogFile() { if (string.IsNullOrEmpty(mFileToObserve) || !File.Exists(mFileToObserve)) { return(false); } using (StreamReader tmpReader = new StreamReader(mFileToObserve)) { string firstLine = tmpReader.ReadLine(); return(LogMessageNLogSimple.TryParse(firstLine, 0, out _)); } }
/// <summary> /// Reads possible new log file entries form the file that is observed. /// </summary> private void ReadNewLogMessagesFromFile() { if (mFileReader == null || Equals(mFileReader.BaseStream.Length, mLastFileOffset)) { return; } if (mLastFileOffset > mFileReader.BaseStream.Length) { // the current log file was re-created. Observe from beginning on. mLastFileOffset = 0; } mFileReader.BaseStream.Seek(mLastFileOffset, SeekOrigin.Begin); string line; LogMessageNLogSimple newLogMsg = null; FixedSizedQueue <LogMessage> messages = new FixedSizedQueue <LogMessage>( Properties.Settings.Default.MaxLogMessages); while ((line = mFileReader.ReadLine()) != null) { try { if (LogMessageNLogSimple.TryParse(line, mLogNumber, out LogMessageNLogSimple message)) { newLogMsg = message; messages.Enqueue(newLogMsg); ++mLogNumber; } else { newLogMsg?.AppendMessage(line); } } catch (Exception ex) { Logger.Warn(ex.Message); continue; } } mLastFileOffset = mFileReader.BaseStream.Position; mLogHandler?.HandleMessage(messages.ToArray()); }