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

本文关键字:网络 跟踪 运行时 启用 | 更新日期: 2023-09-27 17:54:25

在示例中,我可以发现跟踪是通过配置文件启用的,例如

    <?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和实现我自己的TraceListener与反汇编的代码,在Write和WriteLine方法中添加if语句,检查另一个类的一些静态字段,并在配置中添加我的类型。

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

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

首先让我指出你混淆了TraceSwitchTraceSourceTraceSource是用来跟踪消息的。TraceSwitch只控制记录的内容。

当您实例化TraceSource时,它通过检查系统的<sources>集合来初始化自己。相同名称的<source>的诊断设置。如果有一个实例,则使用提供的设置构建实例。然后,您的程序将使用特定的TraceSource实例通过调用TraceEvent或任何其他方法来记录其数据。
如果未找到配置,则配置TraceSourceDefaultTraceListener, SwitchLevel设置为Off。

上面所描述的也是由内部System.Net.Logging类在其InitializeLogging方法中完成的。它为System创建自己的TraceSource实例。Net一旦创建,要么按照配置文件中的定义进行配置,要么使用默认值进行配置。所有由System.Net命名空间中的类完成的日志记录都使用私有/内部的TraceSource

没有公共接口允许您插入或拦截TraceSource构造,因此您无法控制连接哪个侦听器或设置TraceSource等共享/单例上的Switch级别。也没有进入内部System.Diagnostics.DiagnosticsConfiguration类实例的选项。
我确实在System.Configuration.Internal做了一些尝试,但是我放弃了。

如果你喜欢反射,你可以获取内部静态类型System.Net.Logging,并从静态属性Web获得对TraceSource的引用。有了引用之后,我想您可以设置侦听器和开关级别。这是一个内部实现细节,可能会在没有通知的情况下改变,所以我不建议这样做。

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