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

标签 .net nlog

我有原始配置:

<rules>
    <logger name="Logger" minlevel="Trace" writeTo="FileLog,syslog" />
</rules>

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

我希望在运行时更改目标,有时更改为文件日志,有时更改为系统日志,有时更改为两者。 有可编程的方式吗?

最佳答案

两个选项:启用配置自动重新加载( <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

编辑<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>

您现在可以编辑 <logger>FindRuleByNameRemoveRuleByName

例如


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

LogManager.Configuration = config; // Apply new config

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

编辑目标

带布局

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

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

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

例如console target definition :

 <target xsi:type="Console"
          name="String"
          layout="Layout"
          ... 
          encoding="Encoding"
          ...

具有可布局的布局

所以我们可以这样做:

<target name="target1" xsi:type="Console"  layout="${gdc:myLayout}"/>

并在代码中

GlobalDiagnosticsContext.Set("MyLayout", "${message} ${exception");

没有布局

如果它不可布局,例如控制台目标中的“编码”,你可以这样做:

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

更新:添加了更多示例、变体并更新为最新建议。

关于.net - 如何在运行时更改 NLog 规则目标?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36879084/

相关文章:

时间:2019-05-17 标签:c#mysqlconnectionstring问题

c# - 静态析构函数

c# - Linq中默认值的平均扩展方法

c# - NLog - 如何加密数据库中记录的堆栈跟踪

c# - 使用 NLog 事件上下文布局渲染器以 ms 精度记录日期时间

.net - 使用 gitlab-ci 停止 digitalocean ubuntu .net 上的服务器

c# - 在 "undefined"变量上拆分字符串

c# - 在运行时在 NLog 中添加/删除日志文件

c# - Nlog with .NET core- 如何在没有消息的情况下记录 JSON 对象

NLog 禁用特定记录器 - 真正的