From d85bd6c31525ecac3ea345fde1baabcc7e8a1d44 Mon Sep 17 00:00:00 2001 From: Alex Date: Sun, 12 Jan 2025 21:44:30 +0000 Subject: [PATCH] logger --- Core/Callbacks/DialogueCallbacks.cs | 2 +- Core/Callbacks/ModCallbacks.cs | 53 ----------------------- Core/Controllers/ClientLogController.cs | 7 ++- Core/Controllers/GameController.cs | 2 +- Core/DI/OnLoadOrder.cs | 20 ++++----- Core/DI/OnUpdateOrder.cs | 12 ++--- Core/Loaders/PostDBModLoader.cs | 37 ++++++++++++++++ Core/Loaders/PostSptModLoader.cs | 40 +++++++++++++++++ Core/Models/Logging/LogBackgroundColor.cs | 19 ++++---- Core/Models/Logging/LogTextColor.cs | 19 ++++---- Core/Models/Utils/ILogger.cs | 13 +++--- Core/Servers/Http/SptHttpListener.cs | 2 +- Core/Servers/SaveServer.cs | 2 +- Core/Services/PostDbLoadService.cs | 2 +- Core/Utils/JsonUtil.cs | 3 +- Core/Utils/Logging/SimpleTextLogger.cs | 28 ++---------- Core/Utils/Watermark.cs | 2 +- Server/Logger/AbstractFormatter.cs | 20 +++++++++ Server/Logger/ConsoleFormatter.cs | 11 +++++ Server/Logger/FileFormatter.cs | 17 ++++++++ Server/Logger/WebApplicationLogger.cs | 34 +++++++++++++++ Server/Program.cs | 33 ++++++++++++-- Server/Server.csproj | 6 +++ Server/appsettings.json | 36 +++++++++++++++ 24 files changed, 286 insertions(+), 134 deletions(-) delete mode 100644 Core/Callbacks/ModCallbacks.cs create mode 100644 Core/Loaders/PostDBModLoader.cs create mode 100644 Core/Loaders/PostSptModLoader.cs create mode 100644 Server/Logger/AbstractFormatter.cs create mode 100644 Server/Logger/ConsoleFormatter.cs create mode 100644 Server/Logger/FileFormatter.cs create mode 100644 Server/Logger/WebApplicationLogger.cs create mode 100644 Server/appsettings.json diff --git a/Core/Callbacks/DialogueCallbacks.cs b/Core/Callbacks/DialogueCallbacks.cs index b6180142..f16e031f 100644 --- a/Core/Callbacks/DialogueCallbacks.cs +++ b/Core/Callbacks/DialogueCallbacks.cs @@ -8,7 +8,7 @@ using Core.Utils; namespace Core.Callbacks; -[Injectable(InjectableTypeOverride = typeof(OnUpdate), TypePriority = OnUpdateOrder.DialogCallbacks)] +[Injectable(InjectableTypeOverride = typeof(OnUpdate), TypePriority = OnUpdateOrder.DialogueCallbacks)] [Injectable(InjectableTypeOverride = typeof(DialogueCallbacks))] public class DialogueCallbacks : OnUpdate { diff --git a/Core/Callbacks/ModCallbacks.cs b/Core/Callbacks/ModCallbacks.cs deleted file mode 100644 index bc30dcd2..00000000 --- a/Core/Callbacks/ModCallbacks.cs +++ /dev/null @@ -1,53 +0,0 @@ -using Core.Annotations; -using Core.DI; -using Core.Models.Enums; -using Core.Models.Spt.Config; -using Core.Servers; -using Core.Services; -using Core.Utils; -using ILogger = Core.Models.Utils.ILogger; - -namespace Core.Callbacks; - -[Injectable(InjectableTypeOverride = typeof(OnLoad), TypePriority = OnLoadOrder.ModCallbacks)] -public class ModCallbacks : OnLoad -{ - protected ILogger _logger; - protected HttpResponseUtil _httpResponseUtil; - protected HttpFileUtil _httpFileUtil; - // protected PostSptModLoader _postSptModLoader; TODO: needs to be implemented - protected LocalisationService _localisationService; - protected ConfigServer _configServer; - - protected HttpConfig _httpConfig; - - public ModCallbacks - ( - ILogger logger, - HttpResponseUtil httpResponseUtil, - HttpFileUtil httpFileUtil, - LocalisationService localisationService, - ConfigServer configServer - ) - { - _logger = logger; - _httpResponseUtil = httpResponseUtil; - _httpFileUtil = httpFileUtil; - _localisationService = localisationService; - _configServer = configServer; - _httpConfig = configServer.GetConfig(ConfigTypes.HTTP); - } - - public async Task OnLoad() - { - // if (ProgramStatics.MODS) { - // await this.postSptModLoader.load(); - // } TODO: needs to be implemented - return; - } - - public string GetRoute() - { - return "spt-mods"; - } -} diff --git a/Core/Controllers/ClientLogController.cs b/Core/Controllers/ClientLogController.cs index eb73c1cc..8fa61b83 100644 --- a/Core/Controllers/ClientLogController.cs +++ b/Core/Controllers/ClientLogController.cs @@ -24,9 +24,10 @@ public class ClientLogController public void ClientLog(ClientLogRequest logRequest) { var message = $"[{logRequest.Source}] {logRequest.Message}"; + /* TODO: what do we do with this? var color = logRequest.Color ?? LogTextColor.White; var backgroundColor = logRequest.BackgroundColor ?? LogBackgroundColor.Default; - + */ // Allow supporting either string or enum levels // Required due to the C# modules serializing enums as their name @@ -40,13 +41,11 @@ public class ClientLogController this._logger.Warning(message); break; case LogLevel.SUCCESS: - this._logger.Success(message); - break; case LogLevel.INFO: this._logger.Info(message); break; case LogLevel.CUSTOM: - this._logger.Log(message, color.ToString(), backgroundColor.ToString()); + this._logger.Info(message/* TODO: , color.ToString(), backgroundColor.ToString()*/); break; case LogLevel.DEBUG: this._logger.Debug(message); diff --git a/Core/Controllers/GameController.cs b/Core/Controllers/GameController.cs index 38b8d18a..0bbec5de 100644 --- a/Core/Controllers/GameController.cs +++ b/Core/Controllers/GameController.cs @@ -135,7 +135,7 @@ public class GameController // flag as migrated fullProfile.SptData.Migrations.Add("39x", _timeUtil.GetTimeStamp()); - _logger.Success($"Migration of 3.9.x profile: {fullProfile.ProfileInfo.Username} completed successfully"); + _logger.Info($"Migration of 3.9.x profile: {fullProfile.ProfileInfo.Username} completed successfully"); } // with our method of converting type from array for this prop, we *might* not need this? diff --git a/Core/DI/OnLoadOrder.cs b/Core/DI/OnLoadOrder.cs index 9e9b75d7..6c5c88ff 100644 --- a/Core/DI/OnLoadOrder.cs +++ b/Core/DI/OnLoadOrder.cs @@ -3,14 +3,14 @@ namespace Core.DI; public static class OnLoadOrder { public const int Database = 0; - public const int PostDBModLoader = 1; - public const int HandbookCallbacks = 2; - public const int HttpCallbacks = 3; - public const int PresetCallbacks = 4; - public const int SaveCallbacks = 5; - public const int TraderCallbacks = 6; - public const int RagfairPriceService = 7; - public const int RagfairCallbacks = 8; - public const int ModCallbacks = 9; - public const int GameCallbacks = 10; + public const int GameCallbacks = 100; + public const int PostDBModLoader = 200; + public const int HandbookCallbacks = 300; + public const int HttpCallbacks = 400; + public const int SaveCallbacks = 500; + public const int TraderCallbacks = 600; + public const int PostSptModLoader = 700; + public const int PresetCallbacks = 800; + public const int RagfairPriceService = 900; + public const int RagfairCallbacks = 1000; } diff --git a/Core/DI/OnUpdateOrder.cs b/Core/DI/OnUpdateOrder.cs index ef8a86dd..e53c3216 100644 --- a/Core/DI/OnUpdateOrder.cs +++ b/Core/DI/OnUpdateOrder.cs @@ -2,10 +2,10 @@ namespace Core.DI; public static class OnUpdateOrder { - public const int DialogCallbacks = 0; - public const int HideoutCallbacks = 1; - public const int TraderCallbacks = 2; - public const int RagfairCallbacks = 3; - public const int InsuranceCallbacks = 4; - public const int SaveCallbacks = 5; + public const int DialogueCallbacks = 0; + public const int HideoutCallbacks = 100; + public const int TraderCallbacks = 200; + public const int RagfairCallbacks = 300; + public const int InsuranceCallbacks = 400; + public const int SaveCallbacks = 500; } diff --git a/Core/Loaders/PostDBModLoader.cs b/Core/Loaders/PostDBModLoader.cs new file mode 100644 index 00000000..dceb41b1 --- /dev/null +++ b/Core/Loaders/PostDBModLoader.cs @@ -0,0 +1,37 @@ +using Core.Annotations; +using Core.DI; +using Core.Models.External; +using ILogger = Core.Models.Utils.ILogger; + +namespace Core.Loaders; + +[Injectable(InjectableTypeOverride = typeof(OnLoad), TypePriority = OnLoadOrder.PostDBModLoader)] +public class PostDBModLoader : OnLoad +{ + private readonly ILogger _logger; + private readonly IEnumerable _postDbLoadMods; + + public PostDBModLoader( + ILogger logger, + IEnumerable postDbLoadMods + ) + { + _logger = logger; + _postDbLoadMods = postDbLoadMods; + } + + public async Task OnLoad() + { + _logger.Info("Loading PostDBLoadMod..."); + foreach (var postDbLoadMod in _postDbLoadMods) + { + postDbLoadMod.PostDBLoad(); + } + _logger.Info("Finished loading PostDBLoadMod..."); + } + + public string GetRoute() + { + return "spt-post-db-mods"; + } +} diff --git a/Core/Loaders/PostSptModLoader.cs b/Core/Loaders/PostSptModLoader.cs new file mode 100644 index 00000000..b2fb475e --- /dev/null +++ b/Core/Loaders/PostSptModLoader.cs @@ -0,0 +1,40 @@ +using Core.Annotations; +using Core.DI; +using Core.Models.External; +using ILogger = Core.Models.Utils.ILogger; + +namespace Core.Loaders; + +[Injectable(InjectableTypeOverride = typeof(OnLoad), TypePriority = OnLoadOrder.PostSptModLoader)] +public class PostSptModLoader : OnLoad +{ + private readonly ILogger _logger; + private readonly IEnumerable _postSptLoadMods; + + public PostSptModLoader( + ILogger logger, + IEnumerable postSptLoadMods + ) + { + _logger = logger; + _postSptLoadMods = postSptLoadMods; + } + + public async Task OnLoad() + { + // if (ProgramStatics.MODS) { + // await this.postSptModLoader.load(); + // } TODO: needs to be implemented + _logger.Info("Loading PostSptMods..."); + foreach (var postSptLoadMod in _postSptLoadMods) + { + postSptLoadMod.PostSptLoad(); + } + _logger.Info("Finished loading PostSptMods..."); + } + + public string GetRoute() + { + return "spt-post-spt-mods"; + } +} diff --git a/Core/Models/Logging/LogBackgroundColor.cs b/Core/Models/Logging/LogBackgroundColor.cs index 08c5d2c8..1076ad81 100644 --- a/Core/Models/Logging/LogBackgroundColor.cs +++ b/Core/Models/Logging/LogBackgroundColor.cs @@ -2,13 +2,12 @@ public enum LogBackgroundColor { - Default, - Black, - Red, - Green, - Yellow, - Blue, - Magenta, - Cyan, - White -} \ No newline at end of file + Black = 40, + Red = 41, + Green = 42, + Yellow = 43, + Blue = 44, + Magenta = 45, + Cyan = 46, + White = 47 +} diff --git a/Core/Models/Logging/LogTextColor.cs b/Core/Models/Logging/LogTextColor.cs index c2a76282..d5fc2505 100644 --- a/Core/Models/Logging/LogTextColor.cs +++ b/Core/Models/Logging/LogTextColor.cs @@ -2,13 +2,12 @@ public enum LogTextColor { - Black, - Red, - Green, - Yellow, - Blue, - Magenta, - Cyan, - White, - Gray -} \ No newline at end of file + Black = 30, + Red = 31, + Green = 32, + Yellow = 33, + Blue = 34, + Magenta = 35, + Cyan = 36, + White = 37 +} diff --git a/Core/Models/Utils/ILogger.cs b/Core/Models/Utils/ILogger.cs index 587a7885..05db1976 100644 --- a/Core/Models/Utils/ILogger.cs +++ b/Core/Models/Utils/ILogger.cs @@ -4,12 +4,13 @@ namespace Core.Models.Utils; public interface ILogger { - void WriteToLogFile(string data); - void Log(string data, string color, string? backgroundColor = null); - void LogWithColor(string data, LogTextColor textColor, LogBackgroundColor? backgroundColor = null); + // TODO: Removing these 4 methods for now, revisit in the future + // void WriteToLogFile(string data); + // void Log(string data, LogTextColor? color, string? backgroundColor = null); + // void LogWithColor(string data, LogTextColor textColor, LogBackgroundColor? backgroundColor = null); + // void Success(string data); void Error(string data); void Warning(string data); - void Success(string data); void Info(string data); - void Debug(string data, bool? onlyShowInConsole = null); -} \ No newline at end of file + void Debug(string data); +} diff --git a/Core/Servers/Http/SptHttpListener.cs b/Core/Servers/Http/SptHttpListener.cs index 125973c7..d2a264d1 100644 --- a/Core/Servers/Http/SptHttpListener.cs +++ b/Core/Servers/Http/SptHttpListener.cs @@ -82,7 +82,7 @@ public class SptHttpListener : IHttpListener } if (!requestIsCompressed) { - _logger.Debug(value, true); + _logger.Debug(value); } var response = GetResponse(sessionId, req, value); diff --git a/Core/Servers/SaveServer.cs b/Core/Servers/SaveServer.cs index 62f4a171..d17e78b0 100644 --- a/Core/Servers/SaveServer.cs +++ b/Core/Servers/SaveServer.cs @@ -106,7 +106,7 @@ public class SaveServer totalTime += SaveProfile(sessionID.Key); } - _logger.Debug($"Saved {profiles.Count} profiles, took: {totalTime}ms", false); + _logger.Debug($"Saved {profiles.Count} profiles, took: {totalTime}ms"); } /** diff --git a/Core/Services/PostDbLoadService.cs b/Core/Services/PostDbLoadService.cs index d19d5cda..b7f168cc 100644 --- a/Core/Services/PostDbLoadService.cs +++ b/Core/Services/PostDbLoadService.cs @@ -7,7 +7,7 @@ public class PostDbLoadService { public void PerformPostDbLoadActions() { - throw new NotImplementedException(); + // TODO: } protected void AdjustMinReserveRaiderSpawnChance() diff --git a/Core/Utils/JsonUtil.cs b/Core/Utils/JsonUtil.cs index 368771eb..9c8083ee 100644 --- a/Core/Utils/JsonUtil.cs +++ b/Core/Utils/JsonUtil.cs @@ -21,7 +21,8 @@ public class JsonUtil new EftEnumConverter(), new EftEnumConverter(), new EftEnumConverter(), - new EftEnumConverter() + new EftEnumConverter(), + new EftEnumConverter() } }; private static readonly JsonSerializerOptions jsonSerializerOptionsIndented = new(jsonSerializerOptionsNoIndent) diff --git a/Core/Utils/Logging/SimpleTextLogger.cs b/Core/Utils/Logging/SimpleTextLogger.cs index 989b41fa..bc2fa94b 100644 --- a/Core/Utils/Logging/SimpleTextLogger.cs +++ b/Core/Utils/Logging/SimpleTextLogger.cs @@ -4,24 +4,9 @@ using ILogger = Core.Models.Utils.ILogger; namespace Core.Utils.Logging; -[Injectable(InjectionType.Singleton)] +// [Injectable(InjectionType.Singleton)] public class SimpleTextLogger : ILogger { - // TODO: for now we simplify the logger into this barebones console writer - public void WriteToLogFile(string data) - { - Console.WriteLine(data); - } - - public void Log(string data, string color, string? backgroundColor = null) - { - Console.WriteLine(data); - } - - public void LogWithColor(string data, LogTextColor textColor, LogBackgroundColor? backgroundColor = null) - { - Console.WriteLine(data); - } public void Error(string data) { @@ -32,19 +17,14 @@ public class SimpleTextLogger : ILogger { Console.WriteLine(data); } - - public void Success(string data) - { - Console.WriteLine(data); - } - + public void Info(string data) { Console.WriteLine(data); } - public void Debug(string data, bool? onlyShowInConsole = null) + public void Debug(string data) { Console.WriteLine(data); } -} \ No newline at end of file +} diff --git a/Core/Utils/Watermark.cs b/Core/Utils/Watermark.cs index 2622a1b1..475555b2 100644 --- a/Core/Utils/Watermark.cs +++ b/Core/Utils/Watermark.cs @@ -182,7 +182,7 @@ public class Watermark { // Log watermark to screen foreach (var text in result) { - _logger.LogWithColor(text, LogTextColor.Yellow); + _logger.Warning(text); } } } diff --git a/Server/Logger/AbstractFormatter.cs b/Server/Logger/AbstractFormatter.cs new file mode 100644 index 00000000..e9cbf739 --- /dev/null +++ b/Server/Logger/AbstractFormatter.cs @@ -0,0 +1,20 @@ +using Serilog.Events; +using Serilog.Formatting; + +namespace Server.Logger; + +public abstract class AbstractFormatter : ITextFormatter +{ + protected abstract string ProcessText(string text); + + public void Format(LogEvent logEvent, TextWriter output) + { + var newLine = Environment.NewLine; + var timestamp = logEvent.Timestamp.ToString("HH:mm:ss"); + var logLevel = logEvent.Level.ToString().ToUpper().Substring(0, 4); + var message = logEvent.RenderMessage(); + var exception = logEvent.Exception != null ? $"{newLine}{logEvent.Exception}{newLine}{logEvent.Exception.StackTrace}" : ""; + var logMessage = ProcessText($"[{timestamp} {logLevel}] {message}{exception}"); + output.WriteLine(logMessage); + } +} diff --git a/Server/Logger/ConsoleFormatter.cs b/Server/Logger/ConsoleFormatter.cs new file mode 100644 index 00000000..ab54e092 --- /dev/null +++ b/Server/Logger/ConsoleFormatter.cs @@ -0,0 +1,11 @@ +namespace Server.Logger; + +public class ConsoleFormatter : AbstractFormatter +{ + protected override string ProcessText(string text) + { + return text; + } + + public static ConsoleFormatter Default { get; } = new ConsoleFormatter(); +} diff --git a/Server/Logger/FileFormatter.cs b/Server/Logger/FileFormatter.cs new file mode 100644 index 00000000..d7872231 --- /dev/null +++ b/Server/Logger/FileFormatter.cs @@ -0,0 +1,17 @@ +using System.Text.RegularExpressions; + +namespace Server.Logger; + +public class FileFormatter : AbstractFormatter +{ + protected override string ProcessText(string message) + { + foreach (Match match in Regex.Matches(message, @"\x1b\[((\d.+?)?\d)m")) + { + message = message.Replace(match.Value, ""); + } + return message.Replace("\"", ""); + } + + public static FileFormatter Default { get; } = new FileFormatter(); +} diff --git a/Server/Logger/WebApplicationLogger.cs b/Server/Logger/WebApplicationLogger.cs new file mode 100644 index 00000000..c12c0205 --- /dev/null +++ b/Server/Logger/WebApplicationLogger.cs @@ -0,0 +1,34 @@ +using Core.Annotations; +using ILogger = Core.Models.Utils.ILogger; + +namespace Server.Logger; + +[Injectable] +public class WebApplicationLogger : ILogger +{ + private Microsoft.Extensions.Logging.ILogger _logger; + public WebApplicationLogger(ILoggerProvider provider) + { + _logger = provider.CreateLogger("SptLogger"); + } + + public void Error(string data) + { + _logger.LogError(data); + } + + public void Warning(string data) + { + _logger.LogWarning(data); + } + + public void Info(string data) + { + _logger.LogInformation(data); + } + + public void Debug(string data) + { + _logger.LogDebug(data); + } +} diff --git a/Server/Program.cs b/Server/Program.cs index a128af0f..b0bbb337 100644 --- a/Server/Program.cs +++ b/Server/Program.cs @@ -3,9 +3,11 @@ using System.Security.Cryptography; using Core.Annotations; using Core.Context; using Core.Models.Enums; +using Core.Models.External; using Core.Models.Spt.Config; using Core.Servers; using Core.Utils; +using Serilog; namespace Server; @@ -17,21 +19,33 @@ public static class Program HarmonyBootstrapper.LoadAllPatches(assemblies); var builder = WebApplication.CreateBuilder(args); + builder.Configuration.AddJsonFile("appsettings.json", true, true); + + CreateAndRegisterLogger(builder); + RegisterSptComponents(builder.Services); RegisterModOverrideComponents(builder.Services, assemblies); - try { var serviceProvider = builder.Services.BuildServiceProvider(); var watermark = serviceProvider.GetService(); + // Initialize Watermak watermark.Initialize(); - // TODO: var preSptModLoader = serviceProvider.GetService(); - var app = serviceProvider.GetService(); + + // Initialize PreSptMods + var preSptLoadMods = serviceProvider.GetServices(); + foreach (var preSptLoadMod in preSptLoadMods) + { + preSptLoadMod.PreSptLoad(); + } var appContext = serviceProvider.GetService(); - // These are the mod assemblies we are gonna use on the PreSpt, PostDb and PostSpt loaders + // Add the Loaded Mod Assemblies for later appContext.AddValue(ContextVariableType.LOADED_MOD_ASSEMBLIES, assemblies); // This is the builder that will get use by the HttpServer to start up the web application appContext.AddValue(ContextVariableType.APP_BUILDER, builder); + + // Get the Built app and run it + var app = serviceProvider.GetService(); app.Run().Wait(); var httpConfig = serviceProvider.GetService().GetConfig(ConfigTypes.HTTP); @@ -45,6 +59,15 @@ public static class Program } } + private static void CreateAndRegisterLogger(WebApplicationBuilder builder) + { + builder.Logging.ClearProviders(); + var logger = new LoggerConfiguration() + .ReadFrom.Configuration(builder.Configuration) + .CreateLogger(); + builder.Logging.AddSerilog(logger); + } + private static void RegisterModOverrideComponents(IServiceCollection builderServices, List assemblies) { // We get all the services from this assembly first, since mods will override them later @@ -101,6 +124,8 @@ public static class Program private static void RegisterSptComponents(IServiceCollection builderServices) { // We get all the services from this assembly first, since mods will override them later + RegisterComponents(builderServices, typeof(Program).Assembly.GetTypes() + .Where(type => Attribute.IsDefined(type, typeof(Injectable)))); RegisterComponents(builderServices, typeof(App).Assembly.GetTypes() .Where(type => Attribute.IsDefined(type, typeof(Injectable)))); } diff --git a/Server/Server.csproj b/Server/Server.csproj index f1645c7e..59553677 100644 --- a/Server/Server.csproj +++ b/Server/Server.csproj @@ -18,12 +18,18 @@ + + PreserveNewest + + + Always + diff --git a/Server/appsettings.json b/Server/appsettings.json new file mode 100644 index 00000000..e5a6eb10 --- /dev/null +++ b/Server/appsettings.json @@ -0,0 +1,36 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "Serilog": { + "WriteTo": [ + { + "Name": "Async", + "Args": { + "configure": [ + { + "Name": "Console", + "Args": { + "formatter": "Server.Logger.ConsoleFormatter::Default, Server" + } + }, + { + "Name": "File", + "Args": { + "formatter": "Server.Logger.FileFormatter::Default, Server", + "path": "./user/logs/log.txt", + "fileSizeLimitBytes": "20971520", + "rollOnFileSizeLimit": true, + "rollingInterval": "Day" + } + } + ] + } + } + ] + } +}