winlog/Worker.cs

113 lines
4.7 KiB
C#

using Infineon.Monitoring.MonA;
using System.Diagnostics;
using System.Globalization;
using WinLog.Models;
namespace WinLog;
public class Worker : BackgroundService
{
private int? _LastValue;
private DateTime? _LastUpload;
private readonly Calendar _Calendar;
private readonly ILogger<Worker> _Logger;
private readonly AppSettings _AppSettings;
public Worker(ILogger<Worker> logger, AppSettings appSettings)
{
_Logger = logger;
_AppSettings = appSettings;
_Calendar = new CultureInfo("en-US").Calendar;
if (!Directory.Exists(_AppSettings.Directory))
_ = Directory.CreateDirectory(_AppSettings.Directory);
}
#pragma warning disable CA1416
private static List<EventLogEntry> GetOracleEventLogEntries(AppSettings appSettings, DateTime dateTime)
{
List<EventLogEntry> results = new();
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 = new();
List<EventLogEntry> 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();
_ = monIn.SendStatus(_AppSettings.MonitorApplicationSite, _AppSettings.MonitorApplicationResource, "Heartbeat", State.Up);
return base.StartAsync(cancellationToken);
}
public override Task StopAsync(CancellationToken cancellationToken)
{
MonIn monIn = MonIn.GetInstance();
_ = monIn.SendStatus(_AppSettings.MonitorApplicationSite, _AppSettings.MonitorApplicationResource, "Heartbeat", State.Down);
return base.StopAsync(cancellationToken);
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
string directory;
DateTime dateTime;
string weekOfYear;
string weekDirectory;
string formattedDateTime;
List<string> lines = new();
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);
}
}
}