using System.Collections.Generic; using Global.API.Util; using Global.Shared.Logging; using NLog; using NLog.Config; using NLog.Targets; namespace Global { public static class GlobalLogManager { private static readonly Dictionary Targets = new Dictionary(); public static IPluginLogger GetLogger(string name) { return new TorchLogger(name); } public static void PatchToUseCustomFileLogger(string name, string filename = null) { if (filename == null) filename = name; var rules = LogManager.Configuration.LoggingRules; for (var i = rules.Count - 1; i >= 0; i--) if (rules[i].NameMatches(name)) rules.RemoveAtFast(i); var logTarget = Targets.ComputeIfAbsent(filename, fn => new FileTarget(filename) { FileName = $"Logs/{fn}-latest.log", Layout = "${var:logStamp} ${logger}: ${var:logContent}", ArchiveOldFileOnStartup = true, ArchiveNumbering = ArchiveNumberingMode.DateAndSequence, ArchiveDateFormat = "dd-MM-yyyy", ArchiveFileName = $"Logs/Archive/{fn}-{{###}}.zip", EnableArchiveFileCompression = true }); var debugRule = new LoggingRule(name, LogLevel.Debug, logTarget); rules.Insert(0, debugRule); if (name == "Keen" && GlobalPlugin.LegacyConfig.LogKeenToConsole) { var consoleRule = new LoggingRule(name, LogLevel.Info, LogManager.Configuration.FindTargetByName("console")); consoleRule.Targets.Add(LogManager.Configuration.FindTargetByName("wpf")); rules.Insert(0, consoleRule); } LogManager.Configuration.Reload(); LogManager.ReconfigExistingLoggers(); } public static Logger GetCustomFileLogger(string name, string filename = null) { if (filename == null) filename = name; var rules = LogManager.Configuration.LoggingRules; var logTarget = Targets.ComputeIfAbsent(filename, fn => new FileTarget(filename) { FileName = $"Logs/{fn}-latest.log", Layout = "${var:logStamp} ${logger}: ${var:logContent}", ArchiveOldFileOnStartup = true, ArchiveNumbering = ArchiveNumberingMode.DateAndSequence, ArchiveDateFormat = "dd-MM-yyyy", ArchiveFileName = $"Logs/Archive/{fn}-{{###}}.zip", EnableArchiveFileCompression = true }); var logRule = new LoggingRule(name, LogLevel.Debug, logTarget); rules.Insert(0, logRule); LogManager.Configuration.Reload(); return LogManager.GetLogger(name); } } }