在我找到的示例中,跟踪是通过配置文件启用的,例如
<?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 语句来检查另一个类的某些静态字段,并将我的类型添加到配置中,以绕过这种限制。