using Infineon.Monitoring.MonA; using System.Diagnostics; using System.Globalization; using WinLog.Models; namespace WinLog; public class Worker : BackgroundService { private int? _LastValue; private bool? _Heartbeat; private DateTime? _LastUpload; private readonly Calendar _Calendar; private readonly ILogger _Logger; private readonly AppSettings _AppSettings; public Worker(ILogger logger, AppSettings appSettings) { _Logger = logger; _Heartbeat = null; _AppSettings = appSettings; _Calendar = new CultureInfo("en-US").Calendar; if (!Directory.Exists(_AppSettings.Directory)) _ = Directory.CreateDirectory(_AppSettings.Directory); } #pragma warning disable CA1416 private static List GetOracleEventLogEntries(AppSettings appSettings, DateTime dateTime) { List results = []; EventLog[] eventLogs = EventLog.GetEventLogs(); long ticks = dateTime.AddMinutes(-appSettings.RollingMinutes).Ticks; foreach (EventLog eventLog in eventLogs) { if (!eventLog.Log.Contains(appSettings.LogFilter)) continue; foreach (object? item in eventLog.Entries) { if (item is not EventLogEntry eventLogEntry) continue; if (eventLogEntry.TimeGenerated.Ticks < ticks) continue; if (!appSettings.MessageFilters.Any(l => eventLogEntry.Message.Contains(l))) continue; results.Add(eventLogEntry); } } return results; } private static List<(DateTime, string)> GetOracleEventLogEntryMessages(AppSettings appSettings, DateTime dateTime) { List<(DateTime, string)> results = []; List collection = GetOracleEventLogEntries(appSettings, dateTime); foreach (EventLogEntry eventLogEntry in collection) results.Add(new(eventLogEntry.TimeGenerated, eventLogEntry.Message)); return results; } #pragma warning restore CA1416 public override Task StartAsync(CancellationToken cancellationToken) { MonIn monIn = MonIn.GetInstance(); string result = monIn.SendStatus(_AppSettings.MonitorApplicationSite, _AppSettings.MonitorApplicationResource, "Heartbeat", State.Ok); _Heartbeat = !string.IsNullOrEmpty(result); return base.StartAsync(cancellationToken); } public override Task StopAsync(CancellationToken cancellationToken) { MonIn monIn = MonIn.GetInstance(); string result = monIn.SendStatus(_AppSettings.MonitorApplicationSite, _AppSettings.MonitorApplicationResource, "Heartbeat", State.Down); _Heartbeat = !string.IsNullOrEmpty(result); return base.StopAsync(cancellationToken); } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { string directory; DateTime dateTime; string weekOfYear; string weekDirectory; string formattedDateTime; List lines = []; MonIn monIn = MonIn.GetInstance(); string performanceName = string.Concat(_AppSettings.MonitorApplicationResource, "_Count"); while (!stoppingToken.IsCancellationRequested) { lines.Clear(); dateTime = DateTime.Now; weekOfYear = _Calendar.GetWeekOfYear(dateTime, CalendarWeekRule.FirstDay, DayOfWeek.Sunday).ToString("00"); weekDirectory = $"{dateTime:yyyy}_Week_{weekOfYear}{@"\"}{dateTime:yyyy-MM-dd}"; directory = Path.Combine(_AppSettings.Directory, weekDirectory); if (!Directory.Exists(directory)) _ = Directory.CreateDirectory(directory); _Logger.LogInformation("Worker running at: {time}", DateTimeOffset.Now); List<(DateTime, string)> collection = GetOracleEventLogEntryMessages(_AppSettings, dateTime); foreach ((DateTime timeGenerated, string message) in collection) { formattedDateTime = timeGenerated.ToString(_AppSettings.DateFormat); lines.Add($"{formattedDateTime}\t{message}"); } File.WriteAllLines(Path.Combine(directory, $"{dateTime.Ticks}.tsv"), lines); if (_LastValue is null || _LastUpload is null || _LastValue.Value != lines.Count || new TimeSpan(dateTime.Ticks - _LastUpload.Value.Ticks).TotalMinutes > 5) { _ = monIn.SendPerformanceMessage(_AppSettings.MonitorApplicationSite, _AppSettings.MonitorApplicationResource, performanceName, value: lines.Count, description: string.Empty); _LastUpload = DateTime.Now; _LastValue = lines.Count; } await Task.Delay(_AppSettings.MillisecondsDelay, stoppingToken); } } }