C#在运行时启用/禁用网络跟踪?

时间:2016-07-04 10:42:44

标签: c#

在示例中,我可以通过配置文件找到跟踪,例如

    <?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <system.diagnostics>
    <sources>
      <source name="System.Net" tracemode="includehex" maxdatasize="1024">
        <listeners>
          <add name="System.Net"/>
        </listeners>
      </source>
    </sources>
    <switches>
      <add name="System.Net" value="Verbose"/>
    </switches>
    <sharedListeners>
      <add name="System.Net"
        type="System.Diagnostics.TextWriterTraceListener"
        initializeData="network.log"
      />
    </sharedListeners>
    <trace autoflush="true" indentsize="4" />    
  </system.diagnostics>
</configuration>

但是我不希望配置文件随我的dll一起提供。此外,我需要能够启用/禁用跟踪并在我的代码中“动态”更改日志名称。 我想出了什么:

FileStream stream = new FileStream("D:\\network1.log", FileMode.OpenOrCreate);
TextWriterTraceListener listener = new TextWriterTraceListener(stream);
Trace.Listeners.Add(listener);
Trace.AutoFlush = true;

TraceSwitch ts = new TraceSwitch("System.Net", ".Net");
ts.Level = TraceLevel.Verbose;

它没有记录任何东西,我不知道在哪里添加交换机,如果这是正确的。 侦听器可以工作,但不会获取任何数据。

我一直在阅读msdn和这篇博文http://www.codeguru.com/csharp/.net/article.php/c19405/Tracing-in-NET-and-Implementing-Your-Own-Trace-Listeners.htm,从我理解的方式来看,一旦添加到Trace.Listeners,一个监听器应该记录当前exe中的所有信息,但这显然是显而易见的不是这样的。

那么如何实现呢?

编辑:我已经设法通过解散TextWriterTraceListener并使用dissasembled代码实现我自己的TraceListener来解决这个限制,添加了Write和WriteLine方法中的staatements来检查另一个类的一些静态字段,并添加我的类型配置。

1 个答案:

答案 0 :(得分:4)

您无法从代码中启用System.Net跟踪,至少不能以受支持的方式启用。

首先我要指出你混淆了TraceSwitchTraceSourceTraceSource是用于跟踪消息的TraceSource。 TraceSwitch仅控制记录的内容。

当您实例化<sources>时,它会通过检查具有相同名称的<source>的system.diagnostics设置的TraceSource集合来初始化自身。如果有,则使用提供的设置构建实例。然后,您的程序将使用该特定TraceEvent实例通过调用TraceSource或任何其他方法来记录其数据。
如果找不到配置,则DefaultTraceListener配置为System.Net.Logging,并且SwitchLevel设置为Off。

我上面描述的内容也由InitializeLogging方法中的内部TraceSource类完成。它为创建的 System.Net 创建了自己的System.Net实例,可以按照配置文件中的定义配置,也可以使用默认配置。 TraceSource命名空间中的类所执行的所有日志记录都使用该私有/内部TraceSource

没有允许您插入或拦截System.Diagnostics.DiagnosticsConfiguration构造的公共接口,因此您无法控制连接哪个侦听器或在像TraceSource这样的共享/单例上设置切换级别。也没有选择进入内部System.Net.Logging类实例 我在System.Configuration.Internal做了一点冒险,但我放弃了。

如果您进行花式反射,则可以获取内部静态类型TraceSource并从静态属性Web获取对System.Net的引用。一旦你有了参考,我想你可以设置监听器和switchlevel。这是一个内部实现细节,可能会更改,恕不另行通知,所以我不建议这样做。

要控制日志记录,请为TraceSource中的类创建重载,并将您自己的display:inline实例和日志信息添加到该实例。