在示例中,我可以通过配置文件找到跟踪,例如
<?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来检查另一个类的一些静态字段,并添加我的类型配置。
答案 0 :(得分:4)
您无法从代码中启用System.Net
跟踪,至少不能以受支持的方式启用。
首先我要指出你混淆了TraceSwitch
和TraceSource
。 TraceSource
是用于跟踪消息的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
实例和日志信息添加到该实例。