NLog 从文件和代码加载配置

NLog load configuration from both file and code

我正在使用 NLog 4.7.2。我想从代码配置它。但是,我想保留修改日志记录配置的可能性,而不必重新启动我的应用程序。我知道我可以自己滚动一些东西(例如,UI 上的一个开关会修改适当的规则并调用 LogManager.ReconfigExistingLoggers()),但我想利用 [=] 的现有功能16=] 配置文件 autoreload.

我的目的是在代码中进行默认配置,然后如果弹出某些内容并且我需要提高日志记录级别,我会修改 XML 配置文件而不重新启动应用程序。

如果像这样使用 NLog.config

<nlog autoreload="true">
   <variable name="minlevel" value="Warn" />
</nlog>

然后像这样执行 LoggingConfiguration 的初始设置:

SetupNLogConfig();
LogManager.ConfigurationReloaded += (sender, args) => {
   SetupNLogConfig();
}

并像这样设置 SetupNLogConfig:

void SetupNLogConfig()
{
     var config = LogManager.Configuration ?? new NLog.Config.LoggingConfiguration();
     Layout minLevel = config.Variables["minlevel"] ?? "Warn";
     string minLevelString = minLevel.Render(LogEventInfo.CreateNullEvent());
     LogLevel minLevelValue = LogLevel.FromString(minLevelString);

     // Targets where to log to: File and Console
     var logfile = new NLog.Targets.FileTarget("logfile") { FileName = "file.txt" };
     var logconsole = new NLog.Targets.ConsoleTarget("logconsole");

     // Rules for mapping loggers to targets            
     config.AddRule(minLevelValue, LogLevel.Fatal, logconsole);
     config.AddRule(minLevelValue, LogLevel.Fatal, logfile);

     // Re-Apply config           
     NLog.LogManager.Configuration = config;
}

然后您可以修改 NLog.config 中的 minlevel 变量,它应该使用更新后的值重新配置。