From 58799594ae79d9201ebf49aa87799c28d87c29b1 Mon Sep 17 00:00:00 2001 From: Oliver Booth Date: Sat, 12 Aug 2023 21:06:48 +0100 Subject: [PATCH] refactor: switch to serilog --- OliverBooth.Blog/Program.cs | 9 ++ OliverBooth.Common/OliverBooth.Common.csproj | 5 ++ OliverBooth/Logging/ColorfulConsoleTarget.cs | 39 -------- OliverBooth/Logging/LogFileTarget.cs | 40 --------- OliverBooth/OliverBooth.csproj | 4 - OliverBooth/Program.cs | 15 ++-- OliverBooth/Services/LoggingService.cs | 95 -------------------- 7 files changed, 21 insertions(+), 186 deletions(-) delete mode 100644 OliverBooth/Logging/ColorfulConsoleTarget.cs delete mode 100644 OliverBooth/Logging/LogFileTarget.cs delete mode 100644 OliverBooth/Services/LoggingService.cs diff --git a/OliverBooth.Blog/Program.cs b/OliverBooth.Blog/Program.cs index 1cc5c43..b7bb215 100644 --- a/OliverBooth.Blog/Program.cs +++ b/OliverBooth.Blog/Program.cs @@ -3,9 +3,18 @@ using OliverBooth.Blog.Middleware; using OliverBooth.Blog.Services; using OliverBooth.Common; using OliverBooth.Common.Extensions; +using Serilog; +using X10D.Hosting.DependencyInjection; + +Log.Logger = new LoggerConfiguration() + .WriteTo.Console() + .WriteTo.File("logs/latest.log", rollingInterval: RollingInterval.Day) + .CreateLogger(); WebApplicationBuilder builder = WebApplication.CreateBuilder(args); builder.Configuration.AddTomlFile("data/config.toml", true, true); +builder.Logging.ClearProviders(); +builder.Logging.AddSerilog(); builder.Services.ConfigureOptions(); builder.Services.AddDbContextFactory(); diff --git a/OliverBooth.Common/OliverBooth.Common.csproj b/OliverBooth.Common/OliverBooth.Common.csproj index 45b3675..f29bf7c 100644 --- a/OliverBooth.Common/OliverBooth.Common.csproj +++ b/OliverBooth.Common/OliverBooth.Common.csproj @@ -21,6 +21,11 @@ + + + + + diff --git a/OliverBooth/Logging/ColorfulConsoleTarget.cs b/OliverBooth/Logging/ColorfulConsoleTarget.cs deleted file mode 100644 index 4013d9b..0000000 --- a/OliverBooth/Logging/ColorfulConsoleTarget.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System.Text; -using NLog; -using NLog.Targets; -using LogLevel = NLog.LogLevel; - -namespace OliverBooth.Logging; - -/// -/// Represents an NLog target which supports colorful output to stdout. -/// -internal sealed class ColorfulConsoleTarget : TargetWithLayout -{ - /// - /// Initializes a new instance of the class. - /// - /// The name of the log target. - public ColorfulConsoleTarget(string name) - { - Name = name; - } - - /// - protected override void Write(LogEventInfo logEvent) - { - var message = new StringBuilder(); - message.Append(Layout.Render(logEvent)); - - if (logEvent.Level == LogLevel.Warn) - Console.ForegroundColor = ConsoleColor.Yellow; - else if (logEvent.Level == LogLevel.Error || logEvent.Level == LogLevel.Fatal) - Console.ForegroundColor = ConsoleColor.Red; - - if (logEvent.Exception is { } exception) - message.Append($": {exception}"); - - Console.WriteLine(message); - Console.ResetColor(); - } -} diff --git a/OliverBooth/Logging/LogFileTarget.cs b/OliverBooth/Logging/LogFileTarget.cs deleted file mode 100644 index 905caf2..0000000 --- a/OliverBooth/Logging/LogFileTarget.cs +++ /dev/null @@ -1,40 +0,0 @@ -using System.Text; -using NLog; -using NLog.Targets; -using OliverBooth.Services; - -namespace OliverBooth.Logging; - -/// -/// Represents an NLog target which writes its output to a log file on disk. -/// -internal sealed class LogFileTarget : TargetWithLayout -{ - private readonly LoggingService _loggingService; - - /// - /// Initializes a new instance of the class. - /// - /// The name of the log target. - /// The . - public LogFileTarget(string name, LoggingService loggingService) - { - _loggingService = loggingService; - Name = name; - } - - /// - protected override void Write(LogEventInfo logEvent) - { - _loggingService.ArchiveLogFilesAsync(false).GetAwaiter().GetResult(); - - using FileStream stream = _loggingService.LogFile.Open(FileMode.Append, FileAccess.Write); - using var writer = new StreamWriter(stream, Encoding.UTF8); - writer.Write(Layout.Render(logEvent)); - - if (logEvent.Exception is { } exception) - writer.Write($": {exception}"); - - writer.WriteLine(); - } -} diff --git a/OliverBooth/OliverBooth.csproj b/OliverBooth/OliverBooth.csproj index c25bc28..c5969e1 100644 --- a/OliverBooth/OliverBooth.csproj +++ b/OliverBooth/OliverBooth.csproj @@ -7,10 +7,6 @@ Linux - - - - diff --git a/OliverBooth/Program.cs b/OliverBooth/Program.cs index 0e8f589..23a0b68 100644 --- a/OliverBooth/Program.cs +++ b/OliverBooth/Program.cs @@ -1,22 +1,23 @@ using Markdig; -using NLog; -using NLog.Extensions.Logging; using OliverBooth.Common; using OliverBooth.Common.Extensions; using OliverBooth.Data; using OliverBooth.Markdown.Template; using OliverBooth.Markdown.Timestamp; using OliverBooth.Services; -using X10D.Hosting.DependencyInjection; +using Serilog; + +Log.Logger = new LoggerConfiguration() + .WriteTo.Console() + .WriteTo.File("logs/latest.log", rollingInterval: RollingInterval.Day) + .CreateLogger(); WebApplicationBuilder builder = WebApplication.CreateBuilder(args); builder.Configuration.AddTomlFile("data/config.toml", true, true); - builder.Logging.ClearProviders(); -builder.Logging.AddNLog(); +builder.Logging.AddSerilog(); builder.Services.ConfigureOptions(); -builder.Services.AddHostedSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); @@ -60,5 +61,3 @@ app.MapControllers(); app.MapRazorPages(); app.Run(); - -LogManager.Shutdown(); diff --git a/OliverBooth/Services/LoggingService.cs b/OliverBooth/Services/LoggingService.cs deleted file mode 100644 index 327f8b2..0000000 --- a/OliverBooth/Services/LoggingService.cs +++ /dev/null @@ -1,95 +0,0 @@ -using System.IO.Compression; -using NLog; -using NLog.Config; -using NLog.Layouts; -using OliverBooth.Logging; -using LogLevel = NLog.LogLevel; - -namespace OliverBooth.Services; - -/// -/// Represents a class which implements a logging service that supports multiple log targets. -/// -/// -/// This class implements a logging structure similar to that of Minecraft, where historic logs are compressed to a .gz and -/// the latest log is found in logs/latest.log. -/// -internal sealed class LoggingService : BackgroundService -{ - private const string LogFileName = "logs/latest.log"; - - /// - /// Initializes a new instance of the class. - /// - public LoggingService() - { - LogFile = new FileInfo(LogFileName); - } - - /// - /// Gets or sets the log file. - /// - /// The log file. - public FileInfo LogFile { get; set; } - - /// - /// Archives any existing log files. - /// - public async Task ArchiveLogFilesAsync(bool archiveToday = true) - { - var latestFile = new FileInfo(LogFile.FullName); - if (!latestFile.Exists) return; - - DateTime lastWrite = latestFile.LastWriteTime; - string lastWriteDate = $"{lastWrite:yyyy-MM-dd}"; - var version = 0; - string name; - - if (!archiveToday && lastWrite.Date == DateTime.Today) return; - - while (File.Exists(name = Path.Combine(LogFile.Directory!.FullName, $"{lastWriteDate}-{++version}.log.gz"))) - { - // body ignored - } - - await using (FileStream source = latestFile.OpenRead()) - { - await using FileStream output = File.Create(name); - await using var gzip = new GZipStream(output, CompressionMode.Compress); - await source.CopyToAsync(gzip); - } - - latestFile.Delete(); - } - - /// - protected override Task ExecuteAsync(CancellationToken stoppingToken) - { - LogFile.Directory?.Create(); - - LogManager.Setup(builder => builder.SetupExtensions(extensions => - { - extensions.RegisterLayoutRenderer("TheTime", info => info.TimeStamp.ToString("HH:mm:ss")); - extensions.RegisterLayoutRenderer("ServiceName", info => info.LoggerName); - })); - - Layout? layout = Layout.FromString("[${TheTime} ${level:uppercase=true}] [${ServiceName}] ${message}"); - var config = new LoggingConfiguration(); - var fileLogger = new LogFileTarget("FileLogger", this) { Layout = layout }; - var consoleLogger = new ColorfulConsoleTarget("ConsoleLogger") { Layout = layout }; - -#if DEBUG - LogLevel minLevel = LogLevel.Debug; -#else - LogLevel minLevel = LogLevel.Info; - if (!string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable("ENABLE_DEBUG_LOGGING"))) - minLevel = LogLevel.Debug; -#endif - config.AddRule(minLevel, LogLevel.Fatal, consoleLogger); - config.AddRule(minLevel, LogLevel.Fatal, fileLogger); - - LogManager.Configuration = config; - - return ArchiveLogFilesAsync(); - } -}