【问题标题】:Remove listeners/ disabling log for trace source in c# code在 C# 代码中删除侦听器/禁用跟踪源的日志
【发布时间】:2013-06-07 08:36:11
【问题描述】:

为了禁用 FirebirdSQL 日志记录,我需要在 app.config 中添加以下代码 (See here):

<system.diagnostics>
    <sources>
      <source name="FirebirdSql.Data.FirebirdClient" switchValue="Off">
        <listeners>
          <clear />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>

这成功了,即没有记录任何内容。 现在我已经在 C# 代码中这样做了,但是尽管我的代码记录了所有内容:

TraceSource ts = new TraceSource("FirebirdSql.Data.FirebirdClient");
ts.Switch = new SourceSwitch("sourceSwitch", "Off");
var listeners = ts.Listeners;
listeners.Clear();
ts.Switch.Level = SourceLevels.Off;

我添加到执行 SQL 语句的程序集中。

我错过了什么?

【问题讨论】:

    标签: c# logging tracelistener


    【解决方案1】:

    这将禁用所有跟踪源,无论它们是如何注册的(在代码中或在配置中)。

    当您创建 TraceSource(在代码或配置中)时,它会被添加到静态列表中。没有公共 API 可以进入该列表。但是那个“私人”关键词是较小的开发人员要遵守的标志,而不是我们。所以我们只是把它踢下来,并引用我们理所当然的变量。然后我们可以添加/删除监听器,关闭跟踪标志——禁用跟踪的方法不止一种。

    此示例将在单个方法中工作,但即使您没有像此示例那样对 TraceSource 的引用,该技术也将/应该工作。

    TraceSource source = new TraceSource("foo");
    SourceSwitch onOff = new SourceSwitch("onOff", "Verbose");
    
    onOff.Level = SourceLevels.Verbose;
    
    ConsoleTraceListener console = new ConsoleTraceListener();
    
    source.Switch = onOff;
    bool alreadyDone = false;
    foreach (var listener in source.Listeners)
    {
        if (typeof(ConsoleTraceListener) == listener.GetType())
        {
            alreadyDone = true;
        }
    }
    if (!alreadyDone)
    {
        source.Listeners.Add(console);
    }
    
    source.TraceInformation("Hellow World! The trace is on!");
    
    List<WeakReference>  traceSources = 
               (List<WeakReference>)typeof(TraceSource)
                   .GetField("tracesources", BindingFlags.NonPublic | BindingFlags.Static)
                   .GetValue(source);
    
    foreach (WeakReference weakReference in traceSources)
    {
        TraceSource target = (TraceSource)weakReference.Target;
        source.TraceInformation(
              "Somebody, in code or config, registered this trace source " + target.Name);
        target.Listeners.Clear();
    }
    source.TraceInformation(
           "Can you still see this? (No you can't, I cleared all the listeners)");
    

    【讨论】:

    • 谢谢。还有一个问题是在初始化期间没有添加跟踪源,而是仅在请求 DB 访问时添加(例如IDbCommand.ExecuteReader())。因此,必须确保在适当的位置调用您的函数,而不仅仅是在应用程序初始化之后。
    猜你喜欢
    • 2019-10-02
    • 1970-01-01
    • 2010-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 2013-03-20
    相关资源
    最近更新 更多