如何在运行时更改 NLog 规则目标?

Mik*_*ike 4 .net nlog

我有原始配置:

<rules>
    <logger name="Logger" minlevel="Trace" writeTo="FileLog,syslog" />
</rules>
Run Code Online (Sandbox Code Playgroud)

它将打印到文件以及发送到服务器。

我希望在运行时更改目标,有时更改为 FileLog,有时更改为 syslog,有时更改为两者。有可编程的方式吗?

Jul*_*ian 6

两个选项:启用<nlog autoreload="true"配置的自动重新加载( ) 和更改配置文件。

或以编程方式:

编辑 <logger>

// remove syslog from first rule
var config = LogManager.Configuration;
config.LoggingRules[0].Targets.RemoveAt(1); 
LogManager.Configuration = config; // Apply new config
Run Code Online (Sandbox Code Playgroud)

<logger>使用更多规则进行编辑

如果规则比较多,那么使用规则索引就有点麻烦了。对于这种情况,NLog 添加了一个ruleName选项 - NLog 4.6.4 中引入。

<rules>
    <logger name="Logger" rulename="rule1" minlevel="Warn" writeTo="FileLog" />
    <logger name="Logger" rulename="rule2" minlevel="Warn" writeTo="Syslog" />
</rules>
Run Code Online (Sandbox Code Playgroud)

您现在可以<logger>使用FindRuleByName和编辑RemoveRuleByName

例如


var config = LogManager.Configuration;
config.FindRuleByName("rule2").EnableLoggingForLevel(LogLevel.Debug); //enable level debug
config.RemoveRuleByName("rule1"); // Remove rule

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

请注意,当“规则名称”不唯一时,第一个规则与该名称一起使用。

编辑目标

有布局

上面的问题谈到了“在运行时更改目标”,这并不完全是上面描述的内容,因为那是关于日志规则的。

您还可以编辑目标,这更容易。

如果目标具有 Layoutable 值(在带有 的文档中可见Layout),您可以使用布局渲染器,例如像${gdc}这样的上下文类(全局上下文)

例如控制台目标定义

 <target xsi:type="Console"
          name="String"
          layout="Layout"
          ... 
          encoding="Encoding"
          ...
Run Code Online (Sandbox Code Playgroud)

具有可布局的布局

所以我们可以这样做:

<target name="target1" xsi:type="Console"  layout="${gdc:myLayout}"/>
Run Code Online (Sandbox Code Playgroud)

并在代码中

GlobalDiagnosticsContext.Set("MyLayout", "${message} ${exception");
Run Code Online (Sandbox Code Playgroud)

无布局

如果它不可布局,例如控制台目标中的“编码”,您可以执行以下操作:

var config = LogManager.Configuration;
config.FindTargetByName<ConsoleTarget>("target1").Encoding = Encoding.ASCII;
LogManager.Configuration = config; // Apply new config

Run Code Online (Sandbox Code Playgroud)

更新:扩展了更多示例、变化并更新到最新建议。