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

时间:2017-12-22 19:55:31

标签: nlog

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

<nlog>
    <include file="..\Common\Logs\Variables.xml" />
    <rules>
        <logger name="*" minlevel="${logLevel}" writeTo="LogFile, Wcf"/>
    </rules>
</nlog>

这是我的Variables.xml文件内容

<?xml version="1.0" encoding="utf-8"?>
<nlog autoReload="true">
  <variable name="logLevel" value="Fatal" />
</nlog>

但是在启动我的应用时出现了异常

Unknown log level: ${logLevel}

我做错了什么或者只是不可能?

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

编辑:在抛出异常之前添加此代码会显示我的变量是否具有所需的值。

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

2 个答案:

答案 0 :(得分:3)

很遗憾,您无法在${...}属性(如minLevel,level等)中使用布局渲染器(<logger>

有两种选择:

使用过滤器

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

缺点:

  • 不太可读
  • 与liLevel属性相比,
  • 损害了性能

更改代码中的规则

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;

答案 1 :(得分:1)

我将变量作为Service Fabric应用程序的一部分存储在配置文件中,该变量会因环境而异,并希望这些变量覆盖Nlog.config文件中的值。 对于上述用户,当我希望为日志级别设置最低级别时,我遇到了同样的问题。我创建了一个变量来从配置文件中检索值,而不是对代码中的级别进行硬编码,就像原始用户所做的那样:

var config = context.CodePackageActivationContext.GetConfigurationPackageObject("Config");
ILoggerFactory logger = new LoggerFactory().AddNLog();
var nlogConfigSection = config.Settings.Sections["MyService_NlogSettings"];

我使用GlobalDiagnosticsContext设置了可以设置的变量,例如连接字符串等,但是由于不喜欢变量,因此显然无法以这种方式设置日志级别!

因此,我做了以下事情:

LogManager.Configuration.LoggingRules[0].SetLoggingLevels((NLog.LogLevel.FromString(nlogConfigSection.Parameters["AzureNLogLevel"].Value)),
                       NLog.LogLevel.FromString("Fatal"));  

“ SetloggingLevels”方法需要记录日志的Minlevel和MaxLevel值,因此我的Config值为min,并且由于复制了“ minLevel”类型的日志记录,所以我将“致命”值硬编码为最大值,尽管显然也可以在我的配置文件中设置。