NLog按LogLevel过滤为MappedDiagnosticsContext

时间:2014-03-08 16:43:20

标签: c# nlog

基于这里的答案:How Thread-Safe is NLog?我创建了一个Logger并向NLog添加了两个MappedDiagnosticsContext:

NLog.MappedDiagnosticsContext.Set("Module", string.Format("{0}.{1}", module.ComputerName, module.ModuleType));
NLog.MappedDiagnosticsContext.Set("ModuleCoreLogLevel", string.Format("LogLevel.{0}", module.CoreLogLevel));

我可以在NLog配置中成功使用“模块”上下文(以编程方式)生成记录器应该记录的文件名:

${{when:when=length('${{mdc:Module}}') == 0:inner=UNSPECIFIED}}${{when:when=length('${{mdc:Module}}') > 0:inner=${{mdc:Module}}}}.txt

此记录,例如具有“模块”上下文“测试”的所有消息到名为模块的文件名.txt

我现在希望能够使用这种方式为不同的模块设置LogLevel,并且只记录与此LogLevel(或更高版本)对应的Log消息

我试图通过过滤器这样做,这意味着,在LoggingRule上我试图添加一个过滤器:

rule92.Filters.Add(new ConditionBasedFilter { Condition = "(level < '${mdc:ModuleCoreLogLevel}')", Action = FilterResult.IgnoreFinal });

然而,这似乎不会过滤消息。 如果我有一个使用Logger.Trace()发出的消息,并且“ModuleCoreLogLevel”上的LogLevel设置为LogLevel.Debug,我仍然可以在生成的LogFile中显示消息。

1 个答案:

答案 0 :(得分:0)

我通过为每个级别执行此操作来解决此问题:

rule92.Filters.Add(new ConditionBasedFilter { Condition = "(equals('${mdc:ModuleCoreLogLevel}', 'LogLevel.Trace') and level < LogLevel.Trace)", Action = FilterResult.IgnoreFinal });