在示例中,我可以发现通过配置文件启用了跟踪,例如
<?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
侦听器后,应将所有thace信息记录在当前exe中,但事实并非如此。
那么如何实现呢?
编辑:我已经设法通过拆解TextWriterTraceListener并用反汇编的代码实现我自己的TraceListener来解决这个限制,并在Write和WriteLine方法中添加是否检查了另一个类的某些静态字段的变量,并在配置中添加了我的类型。
您不能启用对System.Net
代码的跟踪,至少不能以受支持的方式。
首先让我指出,您将aTraceSwitch
和a混合在一起TraceSource
。的TraceSource
是,习惯于跟踪消息之一。TraceSwitch仅控制要记录的内容。
实例化a时,TraceSource
它会通过检查<sources>
system.diagnostics设置的集合来检查<source>
具有相同名称的a来初始化自身。如果有一个实例,则使用提供的设置构建实例。然后,您的程序将使用该特定TraceSource
实例通过调用TraceEvent
或任何其他方法来记录其数据。
如果未找到任何配置,TraceSource
则DefaultTraceListener
使用的SwitchLevel设置为Off进行配置。
我上面描述的内容也由内部System.Net.Logging
类在其InitializeLogging
方法中完成。它TraceSource
为System.Net创建自己的for System.Net实例,该实例可以按配置文件中的定义进行配置,也可以使用默认值进行配置。由System.Net
名称空间中的类完成的所有日志记录都使用该private / internal TraceSource
。
没有公共接口允许您插入或侦听TraceSource
构造,因此您无法控制连接或设置共享级别(如TraceSource)上的Switch级别的侦听器。也没有进入内部System.Diagnostics.DiagnosticsConfiguration
类实例的选项。
我确实尝试过System.Configuration.Internal,但是我放弃了。
如果进行奇特的反射,则可以获取内部静态类型System.Net.Logging
并TraceSource
从static属性获取对的引用Web
。获得参考之后,我想您可以设置侦听器和开关级别。这是内部实现的详细信息,可能会更改,恕不另行通知,因此我不建议您这样做。
要控制日志记录,请为其中的类创建重载,System.Net
然后添加您自己的TraceSource
实例并将信息记录到该实例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句