From 917df358e8dd7d5d6eb045948a7ecd913c08b6af Mon Sep 17 00:00:00 2001 From: JustArchi Date: Wed, 15 Jun 2022 16:08:03 +0200 Subject: [PATCH] Fix logging module corruption on IPC startup failure Failure of IPC startup currently corrupts ASF logging mechanism, and since ASF expects that logging mechanism to be operative afterwards, it crashes in internal code the moment it requires user input. Fix that, and add additional safety safeguards in case we have a legit lack of logging configuration. https://steamcommunity.com/groups/archiasf/discussions/1/3422187248450123255/ --- ArchiSteamFarm/IPC/ArchiKestrel.cs | 2 +- ArchiSteamFarm/NLog/Logging.cs | 10 +++++++--- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/ArchiSteamFarm/IPC/ArchiKestrel.cs b/ArchiSteamFarm/IPC/ArchiKestrel.cs index 89c99754b..f30938701 100644 --- a/ArchiSteamFarm/IPC/ArchiKestrel.cs +++ b/ArchiSteamFarm/IPC/ArchiKestrel.cs @@ -104,7 +104,7 @@ internal static class ArchiKestrel { } ); - builder.UseNLog(); + builder.UseNLog(new NLogAspNetCoreOptions { ShutdownOnDispose = false }); builder.ConfigureWebHostDefaults( webBuilder => { diff --git a/ArchiSteamFarm/NLog/Logging.cs b/ArchiSteamFarm/NLog/Logging.cs index 0948131bb..f8f3b609d 100644 --- a/ArchiSteamFarm/NLog/Logging.cs +++ b/ArchiSteamFarm/NLog/Logging.cs @@ -388,6 +388,10 @@ internal static class Logging { private static void InitConsoleLoggers() { ConsoleLoggingRules.Clear(); + if (LogManager.Configuration == null) { + return; + } + foreach (LoggingRule loggingRule in LogManager.Configuration.LoggingRules.Where(static loggingRule => loggingRule.Targets.Any(static target => target is ColoredConsoleTarget or ConsoleTarget))) { ConsoleLoggingRules.Add(loggingRule); } @@ -418,14 +422,14 @@ internal static class Logging { OnUserInputStart(); } - HistoryTarget? historyTarget = LogManager.Configuration.AllTargets.OfType().FirstOrDefault(); + HistoryTarget? historyTarget = LogManager.Configuration?.AllTargets.OfType().FirstOrDefault(); ArchiKestrel.OnNewHistoryTarget(historyTarget); } private static void OnUserInputEnd() { IsWaitingForUserInput = false; - if (ConsoleLoggingRules.Count == 0) { + if ((ConsoleLoggingRules.Count == 0) || (LogManager.Configuration == null)) { return; } @@ -444,7 +448,7 @@ internal static class Logging { private static void OnUserInputStart() { IsWaitingForUserInput = true; - if (ConsoleLoggingRules.Count == 0) { + if ((ConsoleLoggingRules.Count == 0) || (LogManager.Configuration == null)) { return; }