【问题标题】:Add a default TraceListener for all TraceSources in App.config为 App.config 中的所有 TraceSource 添加默认 TraceListener
【发布时间】:2014-08-21 23:22:22
【问题描述】:

如何在 net 4.0 c# 项目中定义一个默认的 TraceListener,它会自动添加到所有 TraceSources 中?

目前我必须列出我在 App.config 文件中使用的每个命名 TraceSource,如下所示:

  <system.diagnostics>
  <sharedListeners>
      <add name="MyListener" type="MyListenerType,MyAssemblyName" />
  </sharedListeners>
    <sources>
      <source name="Class1" switchValue="All">
        <listeners><add name="MyListener"></add></listeners>
      </source>
      <source name="Class2" switchValue="All">
        <listeners><add name="MyListener"></add></listeners>
      </source>
      <source name="Class3" switchValue="All">
        <listeners><add name="MyListener"></add></listeners>
      </source>
      ... repeat for a gazillion classes ...
    </sources>
  <system.diagnostics>

除非另有说明,否则我正在使用应接收来自所有 TraceSource 的所有输出的 SharedListener。使用上述语法,这需要为每个 TraceSource 手动输入。

每当我引入带有新 TraceSource 的新类时,我都必须更新 App.Config。如果多个程序使用该程序集,我必须更新多个 App.Config。更新这些条目时出现拼写错误不会产生任何错误,它只会默默地忽略来自正确源的所有跟踪输出。

有没有办法可以通过 App.config 设置默认的 TraceListener,这样如果我想偏离默认值,我只需要命名特定的 TraceSources?

【问题讨论】:

    标签: c# .net app-config system.diagnostics tracelistener


    【解决方案1】:

    我没有找到很好的解决方案,所以我所做的至少是集中创建 TraceSources。然后我可以将 app.config 中的任何“跟踪”侦听器添加到这些新创建的源中:

    TraceSource toReturn = new TraceSource(name, filterLevel);
    
    //remove the default trace listener; don't 'clear' the listeners entirely, because that would undo changes made in app.config; this is a decent compromise
    toReturn.Listeners.Remove("Default");
    
    //add all global trace listeners from the app.config
    toReturn.Listeners.AddRange(Trace.Listeners);
    
    return toReturn;
    

    现在,我添加到 &lt;system.diagnostics&gt; \ &lt;trace&gt; \ &lt;listeners&gt; 的所有侦听器都将添加到我使用此代码创建的所有跟踪源中。

    【讨论】:

      【解决方案2】:

      您可以在机器配置中添加一个默认侦听器,但这会影响比您想要影响的更多的应用程序。

      【讨论】:

      • 确实有共享监听器。我的示例中的监听器MyListener 是一个共享监听器,否则我在添加时无法通过名称引用它。 (我会尝试在问题中更清楚地说明这一点)。但是在当前配置下,我仍然需要将此共享侦听器添加到每个 TraceSource。我正在寻找一种方法来避免在 App.Config 中重复每个 TraceSource 名称,同时冒丢失或拼写错误的风险。
      • 对不起。然后您需要修改 machine.config,或者在应用程序启动时在代码中执行此操作,但这需要反射以获取跟踪源的私有列表以向它们添加侦听器。
      猜你喜欢
      • 2012-05-21
      • 1970-01-01
      • 2010-11-16
      • 2013-09-25
      • 2014-07-03
      • 2021-08-03
      • 2011-11-08
      • 1970-01-01
      • 2022-01-21
      相关资源
      最近更新 更多