为什么日志级别没有改变?

Why isn't log level changing?

我正在尝试添加一个允许用户更改日志记录级别的功能。我是 .NET 4.5.2 上的 运行 NLog 4.7.11。从这里开始是我的 nlog 配置:

<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      internalLogFile="E:\nlog-internal.txt">
  <extensions> 
    <add assembly="NLog.Windows.Forms"/> 
  </extensions> 
  <targets>
    <target name="logfile" xsi:type="File" fileName="program.log" layout="${longdate} | ${level:uppercase=true} | ${message} | ${exception}" />
    <target name="logconsole" xsi:type="Console" />
    <target xsi:type="RichTextBox"
        name="logwindow"
        layout="${longdate} | ${level:uppercase=true} | ${message} | ${exception}"
        autoScroll="true"
        maxLines="500"
        controlName="logTextBox"
        formName="LogWindow"
        useDefaultRowColoringRules="true"
        allowAccessoryFormCreation="false"
        messageRetention="All"
        supportLinks="false">
    </target>
  </targets>

  <rules>
    <logger name="*" minlevel="Warn" writeTo="logconsole" />
    <logger name="*" minlevel="Warn" writeTo="logwindow" />
    <logger name="*" minlevel="Debug" writeTo="logfile" />
  </rules>
</nlog>

我认为 SetLoggingLevels 方法会使这项任务变得相当简单:

private void logLevelMenuStripItem_Click(object sender, EventArgs e)
{
    logLevelTraceMenuStripItem.Checked = false;
    logLevelInfoMenuStripItem.Checked = false;
    logLevelDebugMenuStripItem.Checked = false;
    logLevelWarnMenuStripItem.Checked = false;
    logLevelErrorMenuStripItem.Checked = false;

    ToolStripMenuItem source = sender as ToolStripMenuItem;

    source.Checked = true;
    LogLevel newLevel = LogLevel.FromString(source.Text);

    foreach (NLog.Config.LoggingRule rule in LogManager.Configuration.LoggingRules)
    {
        rule.SetLoggingLevels(newLevel, LogLevel.Fatal);
    }
}

无论我用这个设置哪个值,都会遵循我的 nlog.config 中的规则。是否有我需要允许编程重新配置或其他我没有考虑过的设置,或者我是否遇到了错误?

更改配置时,需要应用通知NLog。

例如

var config = LogManager.Configuration;

foreach (NLog.Config.LoggingRule rule in config.LoggingRules)
{
    rule.SetLoggingLevels(newLevel, LogLevel.Fatal);
}

// Apply
LogManager.Configuration = config;

https://github.com/NLog/NLog/wiki/Configure-from-code

有任何更好的(阅读更多线程安全的)方法来更改配置运行时。参见 https://github.com/NLog/NLog/wiki/Configure-from-code#update-config-in-code