删除侦听器/禁用c#代码中跟踪源的日志

删除侦听器/禁用c#代码中跟踪源的日志,c#,logging,tracelistener,C#,Logging,Tracelistener,为了禁用FirebirdSQL日志记录,我需要将以下代码()添加到app.config: <system.diagnostics> <sources> <source name="FirebirdSql.Data.FirebirdClient" switchValue="Off"> <listeners> <clear /> </listeners>

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

<system.diagnostics>
    <sources>
      <source name="FirebirdSql.Data.FirebirdClient" switchValue="Off">
        <listeners>
          <clear />
        </listeners>
      </source>
    </sources>
  </system.diagnostics>
我将其添加到执行SQL语句的程序集中


我缺少什么?

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

创建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)");
TraceSource source=新的TraceSource(“foo”);
SourceSwitch onOff=新的SourceSwitch(“onOff”、“Verbose”);
onOff.Level=SourceLevels.Verbose;
ConsoleTraceListener控制台=新的ConsoleTraceListener();
source.Switch=onOff;
bool-alreadyDone=false;
foreach(source.Listeners中的var侦听器)
{
if(typeof(ConsoleTraceListener)=listener.GetType()
{
alreadyDone=true;
}
}
如果(!alreadyDone)
{
source.Listeners.Add(控制台);
}
source.TraceInformation(“Hellow World!跟踪已打开!”);
列表跟踪资源=
(列表)类型(TraceSource)
.GetField(“tracesources”,BindingFlags.NonPublic | BindingFlags.Static)
.GetValue(来源);
foreach(跟踪资源中的WeakReference WeakReference)
{
TraceSource target=(TraceSource)weakReference.target;
source.Trace信息(
“某人,在代码或配置中,注册了此跟踪源”+target.Name);
target.Listeners.Clear();
}
source.Trace信息(
“你还能看到这个吗?(不,你看不到,我清除了所有的听众)”;

谢谢。还有一个问题是,在初始化期间没有添加跟踪源,而只是在请求DB访问时才添加跟踪源(例如,
IDbCommand.ExecuteReader()
)。因此,必须确保在适当的位置调用函数,而不仅仅是在应用程序初始化之后。
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)");