private void MonitorLogFile()
        {
            _running = true;
            if (File.Exists(_filepath))
            {
                FindInitialPosition();
                while (!_stop)
                {
                    using (var fs = new FileStream(_filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                    {
                        fs.Seek(_offset, SeekOrigin.Begin);
                        if (fs.Length == _offset)
                        {
                            Thread.Sleep(Config.LogFileUpdateDelay());
                            continue;
                        }
                        using (var sr = new StreamReader(fs))
                        {
                            string line;
                            while (!sr.EndOfStream && (line = sr.ReadLine()) != null)
                            {
                                if (line.StartsWith("D "))
                                {
                                    var next = sr.Peek();
                                    if (!sr.EndOfStream && !(next == 'D' || next == 'W'))
                                    {
                                        break;
                                    }
                                    var logLine = new LogEntry(Settings.Name, line);
                                    if ((!Settings.HasFilters || (Settings.StartFilters?.Any(x => logLine.LineContent.StartsWith(x)) ?? false) ||
                                         (Settings.ContainingFilters?.Any(x => logLine.LineContent.Contains(x)) ?? false)) &&
                                        logLine.Time >= _startingPoint)
                                    {
                                        //OnLogFileFound?.Invoke($"MONITOR '{Settings.Name} - Successfully queued {logLine.LineContent}");
                                        _logs.Enqueue(logLine);
                                    }
                                    else
                                    {
                                        //OnLogLineIgnored?.Invoke($"MONITOR '{Settings.Name} - Didn't match filters {logLine.LineContent}");
                                    }
                                }
                                else
                                {
                                    //OnLogLineIgnored?.Invoke($"MONITOR '{Settings.Name} - Ignored {line}'");
                                }
                                _offset += Encoding.UTF8.GetByteCount(line + Environment.NewLine);
                            }
                        }
                    }

                    Thread.Sleep(Config.LogFileUpdateDelay());
                }
            }
            else
            {
                _running = false;
                FileNotFoundException exception = new FileNotFoundException("Unable to start monitoring specified logfile", _filepath);
                OnLogLineError?.Invoke(exception);
            }
        }
 public void Begin(DateTime startingPoint)
 {
     if (!_running)
     {
         _filepath      = Path.Combine(Config.HearthstoneLogDirectory(), Settings.Name + ".log");
         _startingPoint = startingPoint;
         if (File.Exists(_filepath))
         {
             _stop   = false;
             _offset = 0;
             _thread = new Thread(MonitorLogFile)
             {
                 IsBackground = true
             };
             try
             {
                 _thread.Start();
             }
             catch (Exception e)
             {
                 OnLogLineError?.Invoke(e);
             }
         }
         else
         {
             FileNotFoundException exception = new FileNotFoundException("Unable to start monitoring specified logfile", _filepath);
             OnLogLineError?.Invoke(exception);
         }
     }
 }
 public LogFileController(IEnumerable <LogFileMonitorSettings> settings)
 {
     foreach (var setting in settings)
     {
         LogFileMonitor monitor = new LogFileMonitor(setting);
         monitor.OnLogFileFound   += (msg) => OnLogFileFound?.Invoke(msg);
         monitor.OnLogLineIgnored += (msg) => OnLogLineIgnored?.Invoke(msg);
         monitor.OnLogLineError   += (ex) => OnLogLineError?.Invoke(ex);
         _logFileMonitors.Add(monitor);
     }
 }