117 lines
4.8 KiB
C#
117 lines
4.8 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 bool? _Heartbeat;
|
|
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;
|
|
_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<EventLogEntry> GetOracleEventLogEntries(AppSettings appSettings, DateTime dateTime)
|
|
{
|
|
List<EventLogEntry> 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<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();
|
|
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<string> 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);
|
|
}
|
|
}
|
|
|
|
} |