基于这里的答案: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中显示消息。
答案 0 :(得分:0)
我通过为每个级别执行此操作来解决此问题:
rule92.Filters.Add(new ConditionBasedFilter { Condition = "(equals('${mdc:ModuleCoreLogLevel}', 'LogLevel.Trace') and level < LogLevel.Trace)", Action = FilterResult.IgnoreFinal });