问题描述
假定正常捕获所有文件记录器:
<nlog autoReload="true">
<targets>
<target name="file" type="File" layout="${longdate} ${logger} ${message} ${exception:format=tostring}" fileName="$Log.log" archiveFileName="LogArchive.{#}.log" archiveEvery="Day" archiveNumbering="Rolling" maxArchiveFiles="7" concurrentWrites="true" keepFileOpen="false" encoding="utf-8" />
</targets>
<rules>
<logger name="*" minlevel="Info" writeTo="file" />
</logger>
</rules>
</nlog>
当外部库不断地向垃圾邮件发送垃圾邮件并且我不想用它们淹没日志文件时,可以像这样排除它们:
<rules>
<logger name="*" minlevel="Info" writeTo="file" >
<filters>
<when condition="equals('${logger}','SpammyLogger')" action="Ignore" />
</filters>
</logger>
</rules>
由于该异常有时会被另一个类记录器捕获并重新抛出为innerexception,因此过滤这样的结果会更好:
<when condition="contains('${exception}','SpammyLogger.*')" action="Ignore" />
这很好,但是我仍然想知道何时发生异常,我想每x秒记录一次,然后过滤其余部分。因此,我发现了whenRepeated
过滤器可以做到这一点。我可以通过创建与记录器匹配的第二个记录器来进行设置:
<rules>
<logger name="SpammyLogger.*" minlevel="Info" writeTo="file" final="true">
<filters>
<whenRepeated layout="${logger}" timeoutSeconds="30" action="Ignore" FilterCountMessageAppendFormat=" (Hits: {0})" />
</filters>
</logger>
<logger name="*" minlevel="Info" writeTo="file" />
</rules>
这可以工作,但同样不会过滤重新抛出的内部异常,仅过滤原始记录器。我想将其添加为*记录器的过滤器,而不是创建第二个过滤器。或者至少能够过滤{exception}文本,而不是前面的示例中的记录器。
所以TL; DR,由于whenRepeated
没有像when
过滤器这样的条件参数,因此我不能以相同的方式使用它。我也不太明白为什么它需要在过滤器参数中使用layout
(这是格式化输出的一种方式)?有没有办法像普通的when过滤器一样使用它来过滤异常的内容?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)