public static void Roll(LogsFileDatabaseEntry dbe) { dbe.ProcessedFile = false; dbe.LastPosition = 0; dbe.Previous = ""; Instance.UpdateEntry(dbe, 0); dbe.NewFile = true; }
private void UpdateEntry(LogsFileDatabaseEntry dbe, long lastOffset) { lock (_locker) { var fi = new FileInfo(dbe.FileName); dbe.NewFile = !fi.Exists; dbe.CreationTimeUtc = fi.CreationTimeUtc; dbe.SampleTime = DateTime.UtcNow; dbe.LastPosition = lastOffset; WriteDatabaseFileNoLock(); } }
private LogsFileDatabaseEntry AddFileEntry(string logName) { var de = new LogsFileDatabaseEntry(); lock (_locker) { var fi = new FileInfo(logName); de.FileName = logName; de.LogFileExists = fi.Exists; de.Previous = ""; de.NewFile = true; de.ProcessedFile = false; de.LastPosition = fi.Length; de.SampleTime = DateTime.UtcNow; de.CreationTimeUtc = fi.CreationTimeUtc; Entries.Add(de); WriteDatabaseFileNoLock(); } return(de); }
public static LogsFileDatabaseEntry LookupLogFile(string logName) { LogsFileDatabaseEntry dbe = Instance.FindFile(logName); if (dbe == null) { dbe = Instance.AddFileEntry(logName); } FileInfo fi = new FileInfo(logName); dbe.LogFileExists = fi.Exists; var creationTime = fi.CreationTimeUtc; if (dbe.LogFileExists && creationTime != dbe.CreationTimeUtc) { dbe.NewFile = true; dbe.Previous = ""; } dbe.CreationTimeUtc = creationTime; return(dbe); }
public static void Update(LogsFileDatabaseEntry dbe, bool processedFile, long lastOffset) { dbe.ProcessedFile = processedFile; dbe.LogFileExists = File.Exists(dbe.FileName); Instance.UpdateEntry(dbe, lastOffset); }
private LogsFileDatabaseEntry AddFileEntry(string logName) { var de = new LogsFileDatabaseEntry(); lock (_locker) { var fi = new FileInfo(logName); de.FileName = logName; de.LogFileExists = fi.Exists; de.Previous = ""; de.NewFile = true; de.ProcessedFile = false; de.LastPosition = fi.Length; de.SampleTime = DateTime.UtcNow; de.CreationTimeUtc = fi.CreationTimeUtc; Entries.Add(de); WriteDatabaseFileNoLock(); } return de; }
private void TailFileContents(string fileName, long offset, LogsFileDatabaseEntry dbe) { const int bufSize = 16535; long prevLen = offset; FileInfo fi = new FileInfo(fileName); if (!fi.Exists) { return; } LogManager.GetCurrentClassLogger().Trace(":{0} Tailing File: {1} as Pos: {2}", Thread.CurrentThread.ManagedThreadId, fileName, prevLen); using (var stream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) { stream.Seek(prevLen, SeekOrigin.Begin); char[] buffer = new char[bufSize]; StringBuilder current = new StringBuilder(); using (StreamReader sr = new StreamReader(stream)) { int nRead; do { // Read a buffered amount nRead = sr.ReadBlock(buffer, 0, bufSize); for (int i = 0; i < nRead; ++i) { // We need the terminator! if (buffer[i] == '\n' || buffer[i] == '\r') { if (current.Length > 0) { string line = string.Concat(dbe.Previous, current); var json = new JObject(); if (json["logSource"] == null) { if (string.IsNullOrEmpty(_arguments.LogSource)) { json.Add(new JProperty("logSource", fileName)); } else { json.Add(new JProperty("logSource", _arguments.LogSource)); } } //LogManager.GetCurrentClassLogger().Debug(":{0} File: {1}:{2} {3}", Thread.CurrentThread.ManagedThreadId, fileName, dbe.LinesProcessed, line); // We've processed the partial input dbe.Previous = ""; json["Text"] = line; json["Index"] = dbe.LinesProcessed; json["LogFileName"] = fileName; if (_codecArguments != null && _codecArguments.Type == CodecArguments.CodecType.multiline) { try { _codec.Apply(line, this); Interlocked.Increment(ref _receivedMessages); dbe.IncrementLineCount(); } catch (Exception ex) { Interlocked.Increment(ref _errorCount); LogManager.GetCurrentClassLogger().ErrorException("Filter Error", ex); } } else { try { ProcessJson(json); dbe.IncrementLineCount(); Interlocked.Increment(ref _receivedMessages); LogsFileDatabase.Update(dbe, true, sr.BaseStream.Position); } catch (Exception ex) { Interlocked.Increment(ref _errorCount); LogManager.GetCurrentClassLogger().ErrorException("Process Error", ex); } } } current = new StringBuilder(); } else // Copy character into the buffer { current.Append(buffer[i]); } } } while (nRead > 0); // We didn't encounter the newline, so save it. if (current.Length > 0) { dbe.Previous = current.ToString(); } } } }
private void TailFileContents(string fileName, long offset, LogsFileDatabaseEntry dbe) { const int bufSize = 16535; long prevLen = offset; FileInfo fi = new FileInfo(fileName); if (!fi.Exists) return; LogManager.GetCurrentClassLogger().Trace(":{0} Tailing File: {1} as Pos: {2}", Thread.CurrentThread.ManagedThreadId, fileName, prevLen); using (var stream = new FileStream(fi.FullName, FileMode.Open, FileAccess.Read, FileShare.Delete | FileShare.ReadWrite)) { stream.Seek(prevLen, SeekOrigin.Begin); char[] buffer = new char[bufSize]; StringBuilder current = new StringBuilder(); using (StreamReader sr = new StreamReader(stream)) { int nRead; do { // Read a buffered amount nRead = sr.ReadBlock(buffer, 0, bufSize); for (int i = 0; i < nRead; ++i) { // We need the terminator! if (buffer[i] == '\n' || buffer[i] == '\r') { if (current.Length > 0) { string line = string.Concat(dbe.Previous, current); var json = new JObject(); if (json["logSource"] == null) { if (string.IsNullOrEmpty(_arguments.LogSource)) json.Add(new JProperty("logSource", fileName)); else json.Add(new JProperty("logSource", _arguments.LogSource)); } //LogManager.GetCurrentClassLogger().Debug(":{0} File: {1}:{2} {3}", Thread.CurrentThread.ManagedThreadId, fileName, dbe.LinesProcessed, line); // We've processed the partial input dbe.Previous = ""; json["Text"] = line; json["Index"] = dbe.LinesProcessed; json["LogFileName"] = fileName; if (_codecArguments != null && _codecArguments.Type == CodecArguments.CodecType.multiline) { try { _codec.Apply(line, this); Interlocked.Increment(ref _receivedMessages); dbe.IncrementLineCount(); } catch (Exception ex) { Interlocked.Increment(ref _errorCount); LogManager.GetCurrentClassLogger().ErrorException("Filter Error", ex); } } else { try { ProcessJson(json); dbe.IncrementLineCount(); Interlocked.Increment(ref _receivedMessages); LogsFileDatabase.Update(dbe, true, sr.BaseStream.Position); } catch (Exception ex) { Interlocked.Increment(ref _errorCount); LogManager.GetCurrentClassLogger().ErrorException("Process Error", ex); } } } current = new StringBuilder(); } else // Copy character into the buffer { current.Append(buffer[i]); } } } while (nRead > 0); // We didn't encounter the newline, so save it. if (current.Length > 0) { dbe.Previous = current.ToString(); } } } }