以编程方式添加,启用和禁用NLog记录器

时间:2011-09-19 13:11:26

标签: c# nlog

如何从NLog的代码中添加,编辑,删除,启用和禁用记录器?

3 个答案:

答案 0 :(得分:29)

添加:

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();

答案 1 :(得分:7)

我知道这是一个陈旧的答案,但我想为任何想要修改目标并以编程方式记录规则的人提供反馈,即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的答案:

Update NLog target filename at runtime

答案 2 :(得分:1)

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