【发布时间】:2026-01-31 06:55:01
【问题描述】:
如何在 NLog 的代码中添加、编辑、删除、启用和禁用记录器?
【问题讨论】:
如何在 NLog 的代码中添加、编辑、删除、启用和禁用记录器?
【问题讨论】:
添加:
var logTarget = new ...
logTarget.Layout = "Your layout format here";
// e.g. "${logger}: ${message} ${exception:format=tostring}";
// specify what gets logged to the above target
var loggingRule = new LoggingRule("*", LogLevel.Debug, logTarget);
// add target and rule to configuration
LogManager.Configuration.AddTarget("targetName", logTarget);
LogManager.Configuration.LoggingRules.Add(loggingRule);
LogManager.Configuration.Reload();
删除完成
LogManager.Configuration.LoggingRules.Remove(loggingRule);
LogManager.Configuration.Reload();
【讨论】:
Reload() 在配置更改时由 LogManager 调用,因此调用 LogManager.Configuration.Reload(); 不会重新加载配置。
我知道这是一个旧答案,但我想为任何希望以编程方式修改其目标和日志记录规则的人提供反馈,因为 Configuration.Reload() 不起作用。
要以编程方式更新现有目标,您需要使用 ReconfigExistingLoggers 方法:
var target = (FileTarget)LogManager.Configuration.FindTargetByName("logfile");
target.FileName = "${logDirectory}/file2.txt";
LogManager.ReconfigExistingLoggers();
动态添加和删除日志记录规则的示例:
if (VerboseLogging && !LogManager.Configuration.LoggingRules.Contains(VerboseLoggingRule))
{
LogManager.Configuration.LoggingRules.Add(VerboseLoggingRule);
LogManager.ReconfigExistingLoggers();
}
else if (!VerboseLogging && LogManager.Configuration.LoggingRules.Contains(VerboseLoggingRule))
{
LogManager.Configuration.LoggingRules.Remove(VerboseLoggingRule);
LogManager.ReconfigExistingLoggers();
}
如文档中所写:
循环遍历以前由 GetLogger 返回的所有记录器。和 重新计算他们的目标和过滤器列表。修改后有用 以编程方式配置以确保所有记录器都已 正确配置。
此答案和示例来自 Tony 的答案:
【讨论】:
NLog 4.6.7 可以将布局变量分配给 LoggingRule 级别,并在运行时更改这些布局变量。
<nlog>
<variable name="myLevel" value="Warn" />
<rules>
<logger minLevel="${var:myLevel}" />
</rules>
</nlog>
然后你可以在代码中做到这一点:
LogManager.Configuration.Variables["myLevel"] = "Debug";
LogManager.ReconfigExistingLoggers();
另请参阅:https://github.com/NLog/NLog/wiki/Filtering-log-messages#semi-dynamic-routing-rules
【讨论】: