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语句,检查另一个类的一些静态字段,并在配置中添加我的类型。
您不能从代码中启用System.Net
跟踪,至少不能以支持的方式启用。
首先让我指出你混淆了TraceSwitch
和TraceSource
。TraceSource
是用来跟踪消息的。TraceSwitch只控制记录的内容。
当您实例化TraceSource
时,它通过检查系统的<sources>
集合来初始化自己。相同名称的<source>
的诊断设置。如果有一个实例,则使用提供的设置构建实例。然后,您的程序将使用特定的TraceSource
实例通过调用TraceEvent
或任何其他方法来记录其数据。
如果未找到配置,则配置TraceSource
和DefaultTraceListener
, 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
实例和日志信息添加到该实例。