diff --git a/.vscode/launch.json b/.vscode/launch.json index 46775c0..0d7a83f 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -10,7 +10,7 @@ "request": "launch", "preLaunchTask": "build", // If you have changed target frameworks, make sure to update the program path. - "program": "${workspaceFolder}/bin/Debug/net6.0/win-x64/WinLog.dll", + "program": "${workspaceFolder}/bin/Debug/net8.0/win-x64/WinLog.dll", "args": [], "cwd": "${workspaceFolder}", // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console @@ -25,5 +25,5 @@ ] } -// dotnet publish --configuration Release -o "C:\Users\ECUSLEOCamstarTsvc\AppData\Local\IFXApps\WinLog\bin\Release\net6.0\win-x64\publish" -//sc create "WinLog-5001" start= delayed-auto DisplayName="WinLog-5001" binPath= "C:\Users\ECUSLEOCamstarTsvc\AppData\Local\IFXApps\WinLog\bin\Release\net6.0\win-x64\publish\WinLog.exe" obj= "infineon\ECUSLEOCamstarTsvc" password= ";tS&Yqp$i1(Kp;n" +// dotnet publish --configuration Release -o "C:\Users\ECUSLEOCamstarTsvc\AppData\Local\IFXApps\WinLog\bin\Release\net8.0\win-x64\publish" +//sc create "WinLog-5001" start= delayed-auto DisplayName="WinLog-5001" binPath= "C:\Users\ECUSLEOCamstarTsvc\AppData\Local\IFXApps\WinLog\bin\Release\net8.0\win-x64\publish\WinLog.exe" obj= "infineon\ECUSLEOCamstarTsvc" password= ";tS&Yqp$i1(Kp;n" diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 486c0b9..c92a317 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -36,6 +36,23 @@ "${workspaceFolder}/WinLog.csproj" ], "problemMatcher": "$msCompile" + }, + { + "label": "Publish AOT", + "command": "dotnet", + "type": "process", + "args": [ + "publish", + "-r", + "win-x64", + "-c", + "Release", + "-p:PublishAot=true", + "${workspaceFolder}/WinLog.csproj", + "/property:GenerateFullPaths=true", + "/consoleloggerparameters:NoSummary" + ], + "problemMatcher": "$msCompile" } ] } \ No newline at end of file diff --git a/Models/AppSettings.cs b/Models/AppSettings.cs index 38e2099..9430b2a 100644 --- a/Models/AppSettings.cs +++ b/Models/AppSettings.cs @@ -3,35 +3,36 @@ using System.Text.Json.Serialization; namespace WinLog.Models; -public class AppSettings +[method: JsonConstructor] +public class AppSettings(string dateFormat, + string directory, + string logFilter, + string[] messageFilters, + string monitorApplicationResource, + string monitorApplicationSite, + int millisecondsDelay, + int rollingMinutes) { - public string DateFormat { init; get; } - public string Directory { init; get; } - public string LogFilter { init; get; } - public string[] MessageFilters { init; get; } - public string MonitorApplicationResource { init; get; } - public string MonitorApplicationSite { init; get; } - public int MillisecondsDelay { init; get; } - public int RollingMinutes { init; get; } - - [JsonConstructor] - public AppSettings(string dateFormat, string directory, string logFilter, string[] messageFilters, string monitorApplicationResource, string monitorApplicationSite, int millisecondsDelay, int rollingMinutes) - { - Directory = directory; - LogFilter = logFilter; - DateFormat = dateFormat; - MessageFilters = messageFilters; - MonitorApplicationResource = monitorApplicationResource; - MonitorApplicationSite = monitorApplicationSite; - MillisecondsDelay = millisecondsDelay; - RollingMinutes = rollingMinutes; - } + public string DateFormat { init; get; } = dateFormat; + public string Directory { init; get; } = directory; + public string LogFilter { init; get; } = logFilter; + public string[] MessageFilters { init; get; } = messageFilters; + public string MonitorApplicationResource { init; get; } = monitorApplicationResource; + public string MonitorApplicationSite { init; get; } = monitorApplicationSite; + public int MillisecondsDelay { init; get; } = millisecondsDelay; + public int RollingMinutes { init; get; } = rollingMinutes; public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, AppSettingsSourceGenerationContext.Default.AppSettings); return result; } +} + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(AppSettings))] +internal partial class AppSettingsSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/Models/Binder/.editorconfig b/Models/Binder/.editorconfig new file mode 100644 index 0000000..1c444cd --- /dev/null +++ b/Models/Binder/.editorconfig @@ -0,0 +1,2 @@ +[*.cs] +csharp_preserve_single_line_statements = true \ No newline at end of file diff --git a/Models/Binder/AppSettings.cs b/Models/Binder/AppSettings.cs index d4482de..2d5b132 100644 --- a/Models/Binder/AppSettings.cs +++ b/Models/Binder/AppSettings.cs @@ -1,5 +1,6 @@ using System.ComponentModel.DataAnnotations; using System.Text.Json; +using System.Text.Json.Serialization; namespace WinLog.Models.Binder; @@ -21,29 +22,21 @@ public class AppSettings public override string ToString() { - string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true }); + string result = JsonSerializer.Serialize(this, BinderAppSettingsSourceGenerationContext.Default.AppSettings); return result; } - private static Models.AppSettings Get(AppSettings appSettings) + private static Models.AppSettings Get(AppSettings? appSettings) { Models.AppSettings result; - if (appSettings.DateFormat is null) - throw new NullReferenceException(nameof(DateFormat)); - if (appSettings.Directory is null) - throw new NullReferenceException(nameof(Directory)); - if (appSettings.LogFilter is null) - throw new NullReferenceException(nameof(LogFilter)); - if (appSettings.MessageFilters is null) - throw new NullReferenceException(nameof(MessageFilters)); - if (appSettings.MillisecondsDelay is null) - throw new NullReferenceException(nameof(MillisecondsDelay)); - if (appSettings.MonitorApplicationResource is null) - throw new NullReferenceException(nameof(MonitorApplicationResource)); - if (appSettings.MonitorApplicationSite is null) - throw new NullReferenceException(nameof(MonitorApplicationSite)); - if (appSettings.RollingMinutes is null) - throw new NullReferenceException(nameof(RollingMinutes)); + if (appSettings?.DateFormat is null) throw new NullReferenceException(nameof(DateFormat)); + if (appSettings?.Directory is null) throw new NullReferenceException(nameof(Directory)); + if (appSettings?.LogFilter is null) throw new NullReferenceException(nameof(LogFilter)); + if (appSettings?.MessageFilters is null) throw new NullReferenceException(nameof(MessageFilters)); + if (appSettings?.MillisecondsDelay is null) throw new NullReferenceException(nameof(MillisecondsDelay)); + if (appSettings?.MonitorApplicationResource is null) throw new NullReferenceException(nameof(MonitorApplicationResource)); + if (appSettings?.MonitorApplicationSite is null) throw new NullReferenceException(nameof(MonitorApplicationSite)); + if (appSettings?.RollingMinutes is null) throw new NullReferenceException(nameof(RollingMinutes)); result = new(appSettings.DateFormat, appSettings.Directory, appSettings.LogFilter, appSettings.MessageFilters, appSettings.MonitorApplicationResource, appSettings.MonitorApplicationSite, appSettings.MillisecondsDelay.Value, appSettings.RollingMinutes.Value); return result; } @@ -51,9 +44,17 @@ public class AppSettings public static Models.AppSettings Get(IConfiguration configuration) { Models.AppSettings result; - AppSettings appSettings = configuration.Get(); +#pragma warning disable IL3050, IL2026 + AppSettings? appSettings = configuration.Get(); +#pragma warning restore IL3050, IL2026 result = Get(appSettings); return result; } +} + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(AppSettings))] +internal partial class BinderAppSettingsSourceGenerationContext : JsonSerializerContext +{ } \ No newline at end of file diff --git a/WinLog.csproj b/WinLog.csproj index ad5b043..596396f 100644 --- a/WinLog.csproj +++ b/WinLog.csproj @@ -4,13 +4,13 @@ enable Exe win-x64 - net6.0 + net8.0 true - - - + + + diff --git a/Worker.cs b/Worker.cs index fad4732..956516a 100644 --- a/Worker.cs +++ b/Worker.cs @@ -9,6 +9,7 @@ public class Worker : BackgroundService { private int? _LastValue; + private bool? _Heartbeat; private DateTime? _LastUpload; private readonly Calendar _Calendar; private readonly ILogger _Logger; @@ -17,6 +18,7 @@ public class Worker : BackgroundService public Worker(ILogger logger, AppSettings appSettings) { _Logger = logger; + _Heartbeat = null; _AppSettings = appSettings; _Calendar = new CultureInfo("en-US").Calendar; if (!Directory.Exists(_AppSettings.Directory)) @@ -27,7 +29,7 @@ public class Worker : BackgroundService private static List GetOracleEventLogEntries(AppSettings appSettings, DateTime dateTime) { - List results = new(); + List results = []; EventLog[] eventLogs = EventLog.GetEventLogs(); long ticks = dateTime.AddMinutes(-appSettings.RollingMinutes).Ticks; foreach (EventLog eventLog in eventLogs) @@ -50,7 +52,7 @@ public class Worker : BackgroundService private static List<(DateTime, string)> GetOracleEventLogEntryMessages(AppSettings appSettings, DateTime dateTime) { - List<(DateTime, string)> results = new(); + List<(DateTime, string)> results = []; List collection = GetOracleEventLogEntries(appSettings, dateTime); foreach (EventLogEntry eventLogEntry in collection) results.Add(new(eventLogEntry.TimeGenerated, eventLogEntry.Message)); @@ -62,14 +64,16 @@ public class Worker : BackgroundService public override Task StartAsync(CancellationToken cancellationToken) { MonIn monIn = MonIn.GetInstance(); - _ = monIn.SendStatus(_AppSettings.MonitorApplicationSite, _AppSettings.MonitorApplicationResource, "Heartbeat", State.Up); + 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(); - _ = monIn.SendStatus(_AppSettings.MonitorApplicationSite, _AppSettings.MonitorApplicationResource, "Heartbeat", State.Down); + string result = monIn.SendStatus(_AppSettings.MonitorApplicationSite, _AppSettings.MonitorApplicationResource, "Heartbeat", State.Down); + _Heartbeat = !string.IsNullOrEmpty(result); return base.StopAsync(cancellationToken); } @@ -80,7 +84,7 @@ public class Worker : BackgroundService string weekOfYear; string weekDirectory; string formattedDateTime; - List lines = new(); + List lines = []; MonIn monIn = MonIn.GetInstance(); string performanceName = string.Concat(_AppSettings.MonitorApplicationResource, "_Count"); while (!stoppingToken.IsCancellationRequested)