我有一个带有 NLog 用于日志记录的 C# 应用程序,它设置为还记录发送到 System.Diagnostics 的 Trace/Debug 系统的消息。这是在应用程序的配置文件中完成的,如下所示:
<system.diagnostics>
<trace autoflush="true" indentsize="2">
<listeners>
<add name="nLogListener" />
</listeners>
</trace>
<sources>
<!--bunch of extra sources here-->
</sources>
<sharedListeners>
<add name="nLogListener" type="NLog.NLogTraceListener, NLog"/>
</sharedListeners>
</system.diagnostics>
这一切都很好,但是自从我开始使用 AvalonDock 后,日志中就充满了调试信息。我猜想通过 nuGet 拉入的程序集是使用DEBUG
定义的常量编译的,因此在 AvalonDock 源中对 Deug.WriteLine 的调用最终会进入 NLog 日志。顺便说一句,它们看起来像这样:
NLog.LoggerImpl.Write | Attach()
NLog.LoggerImpl.Write | DockingManager.OnPreviewGotKeyboardFocus(System.Windows.Controls.Canvas)
NLog.LoggerImpl.Write | SetFocusOnLastElement(focused=True, model=Xceed.Wpf.AvalonDock.Layout.LayoutAnchorable, element=System.Windows.Controls.Canvas)
NLog.LoggerImpl.Write | DockingManager.OnPreviewLostKeyboardFocus(System.Windows.Controls.Canvas)
我想排除它们,同时仍保留发送到跟踪的所有其他消息。我可以向 NLog 添加一个过滤器以使用通配符等排除所有这些,但我宁愿不这样做,因为:
- 它需要我弄清楚 AvalonDock 可以吐出的所有可能的消息
- 如果 AvalonDock 发生变化,我必须更新过滤器
- 也有排除非 AvalonDock 消息的风险
是否有另一种方法来处理这个问题(无需重新编译 AvalonDock 的源代码)?我可以以某种方式排除来自特定程序集的所有消息吗?或者也许让它们以已知字符串为前缀,以便我可以基于单个字符串过滤消息?