有没有办法通过变量设置 NLog 记录器的最小级别?

cak*_*eby 4 nlog

使用 NLog v4.4.12,我的 App.config 中有这个

<nlog>
    <include file="..\Common\Logs\Variables.xml" />
    <rules>
        <logger name="*" minlevel="${logLevel}" writeTo="LogFile, Wcf"/>
    </rules>
</nlog>
Run Code Online (Sandbox Code Playgroud)

这是我的 Variables.xml 文件内容

<?xml version="1.0" encoding="utf-8"?>
<nlog autoReload="true">
  <variable name="logLevel" value="Fatal" />
</nlog>
Run Code Online (Sandbox Code Playgroud)

但启动我的应用程序时出现异常

Unknown log level: ${logLevel}
Run Code Online (Sandbox Code Playgroud)

我做错了什么还是根本不可能?

这样做的目标是最终为每个项目提供一个需要记录内容的 xml 文件,以便每个项目都可以拥有自己的最小级别,并能够在运行时通过此 xml 的版本进行更改。

编辑:在引发异常之前添加此代码表明我的变量具有所需的值。

var nl = NLog.LogManager.Configuration;
if (nl != null)
{
    if (nl.Variables.ContainsKey("logLevel"))
    {
            Console.WriteLine(nl.Variables["logLevel"]);
    }
}
Run Code Online (Sandbox Code Playgroud)

Jul*_*ian 5

** 更新答案 **

NLog版本。4.6 添加了对在 minLevel 中使用 NLog-Config-Variables 的支持。请参阅https://github.com/NLog/NLog/pull/2709

NLog版本。4.6.7 添加了对在运行时调整 minLevel 的支持,通过修改 NLog-Config-Variables 并调用ReconfigExistingLoggers(). 请参阅https://github.com/NLog/NLog/pull/3184

** 原始答案 **

不幸的是,你不能在minLevel、level 等属性中使用布局渲染器(the ${...}<logger>

有两种选择:

使用过滤器

 <logger name="*"  writeTo="LogFile, Wcf">
      <filters>
          <when condition="(level &lt; ${logLevel})" action="Ignore"/>
      </filters>      
 </logger>
Run Code Online (Sandbox Code Playgroud)

缺点:

  • 可读性较差
  • 与 minLevel 属性相比,对性能的影响更大

更改代码中的规则

var rule = config.LoggingRules[0];
// disable old levels, enable new
rule.DisableLoggingForLevel(LogLevel.Debug);
rule.DisableLoggingForLevel(LogLevel.Trace);
rule.EnableLoggingForLevels(LogLevel.Info, LogLevel.Fatal);

//apply config
LogManager.Configuration = config;
Run Code Online (Sandbox Code Playgroud)