【问题标题】:Why isn't log level changing?为什么日志级别没有改变?
【发布时间】:2021-11-10 19:43:02
【问题描述】:

我正在尝试添加一个功能以允许用户更改日志记录级别。我在 .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 中的规则。是否需要允许以编程方式重新配置的设置或其他我没有考虑过的设置,或者我遇到了错误?

【问题讨论】:

    标签: c# nlog


    【解决方案1】:

    更改配置时,需要应用它来通知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

    【讨论】:

    • 谢谢!我确实按照建议使用了 GDC。更新我配置的最小级别,例如:minlevel="${gdc:LogLevel:whenEmpty=Warn}",然后用GlobalDiagnosticsContext.Set("LogLevel", newLevel.Name) 替换我的整个循环。更线程安全、更简洁的代码!
    • 不错的选择!
    猜你喜欢
    • 2021-11-25
    • 2017-12-02
    • 2011-06-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    • 1970-01-01
    • 1970-01-01
    • 2013-10-04
    相关资源
    最近更新 更多