1

我有一个带有 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 的源代码)?我可以以某种方式排除来自特定程序集的所有消息吗?或者也许让它们以已知字符串为前缀,以便我可以基于单个字符串过滤消息?

4

0 回答 0