如何使用环境变量控制Nlog logLevel

len*_*sha 3 nlog

尝试使用环境变量覆盖 Nlog 配置中的 LogLevel,但它不起作用:例如

<logger name="*"  writeTo="console">
          <filters>
              <when condition="level >= '${environment:LOG_LEVEL}' " action="Ignore"/>
          </filters>      
</logger>
Run Code Online (Sandbox Code Playgroud)

其中 LOG_LEVEL 设置为 LogLevel.Info

与 Nlog Env var 相同的配置有效:

<variable name="myvar1" value="LogLevel.Info"/>
 <logger name="*"  writeTo="console">
          <filters>
              <when condition="level >= '${myvar1}' " action="Ignore"/>
          </filters>      
 </logger>
Run Code Online (Sandbox Code Playgroud)

有关如何使用环境变量的任何提示吗?要写一些扩展吗?

Rol*_*sen 10

更新 NLog 版本 4.6.7

NLog 4.6.7 使得在 LoggingRules 中使用 Layout 变得更加容易:

<logger minLevel="${environment:LOG_LEVEL}" />
Run Code Online (Sandbox Code Playgroud)

但仍然需要显式调用来LogManager.ReconfigExistingLoggers()激活。因此,可能有一个后台线程来监视环境变量的变化,从而触发显式调用。

另请参阅:https://github.com/nlog/NLog/wiki/Filtering-log-messages#semi-dynamic-routing-rules

另请参阅:https ://github.com/NLog/NLog/wiki/Environment-specific-NLog-Logging-Configuration

原始版本(较旧的 NLog)

我知道这有点啰嗦,但也许它会起作用,直到有人创建适当的修复程序:

 <logger name="*"  writeTo="console">
          <filters>
              <when condition="(level >= LogLevel.Fatal and equals('${environment:LOG_LEVEL}','LogLevel.Fatal')" action="Log"/>
              <when condition="(level >= LogLevel.Error and equals('${environment:LOG_LEVEL}','LogLevel.Error')" action="Log"/>
              <when condition="(level >= LogLevel.Info and equals('${environment:LOG_LEVEL}','LogLevel.Info')" action="Log"/>
              <when condition="(level >= LogLevel.Debug and equals('${environment:LOG_LEVEL}','LogLevel.Debug')" action="Log"/>
              <when condition="(level >= LogLevel.Trace and equals('${environment:LOG_LEVEL}','LogLevel.Trace')" action="Log"/>
          </filters>      
 </logger>
Run Code Online (Sandbox Code Playgroud)

顺便提一句。好奇为什么你原来的问题将其设置为小于而不是大于。预计当将 LOG_LEVEL 配置为警告时,它应该记录所有警告或更糟的警告。

上面的示例会对性能造成影响,因为环境变量的查找速度并不快。NLog 4.6.8 引入了 cachedSeconds 功能,可以减少性能损失:

 <logger name="*"  writeTo="console">
          <filters>
              <when condition="(level >= LogLevel.Fatal and equals('${environment:LOG_LEVEL:cachedSeconds=5}','LogLevel.Fatal')" action="Log"/>
              <when condition="(level >= LogLevel.Error and equals('${environment:LOG_LEVEL:cachedSeconds=5}','LogLevel.Error')" action="Log"/>
              <when condition="(level >= LogLevel.Info and equals('${environment:LOG_LEVEL:cachedSeconds=5}','LogLevel.Info')" action="Log"/>
              <when condition="(level >= LogLevel.Debug and equals('${environment:LOG_LEVEL:cachedSeconds=5}','LogLevel.Debug')" action="Log"/>
              <when condition="(level >= LogLevel.Trace and equals('${environment:LOG_LEVEL:cachedSeconds=5}','LogLevel.Trace')" action="Log"/>
          </filters>
 </logger>
Run Code Online (Sandbox Code Playgroud)