例如,着名库HtmlAgilityPack源的最后一个版本类似于110 000行C#,并且程序集为132 KB.
https://www.openhub.net/p/htmlagilitypack
我的项目大约是6500行,编译成300 KB的程序集.
我没有广泛关注源代码,但显然不是100K loc可用类.那么大量的代码在做什么呢?
在C#中,我启用了跟踪和网络跟踪源.
<?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="TraceTest.StringWriterTraceListener, TraceTest"
initializeData="myfile.log"
/>
</sharedListeners>
<trace autoflush="true" indentsize="4" />
</system.diagnostics>
</configuration>
Run Code Online (Sandbox Code Playgroud)
但是更长的消息被截断(长度像12Kb/30行,不长就像1GB!)所以我最终会遇到只记录部分web reqiest标头的情况.
如何解决?
或者您是否知道一本书或一些资源可以非常详细地解释.Net跟踪和调试?
日志示例:
System.Net Information: 0 : [1204] Connection#63291458 - Received headers
{
Transfer-Encoding: chunked
Connection: keep-alive
Keep-Alive: timeout=10
Content-Type: text/html; charset=windows-1251
Date: Mon, 04 Jul 2016 17:50:33 GMT
Set-Cookie: uid=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; …Run Code Online (Sandbox Code Playgroud) 在示例中,我可以发现通过配置文件启用了跟踪,例如
<?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>
Run Code Online (Sandbox Code Playgroud)
但是我不希望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;
Run Code Online (Sandbox Code Playgroud)
而且它没有记录任何内容,而且我也不知道将开关添加到何处,如果这是正确的话。侦听器可以工作,但不会获取任何数据。
我一直在阅读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方法中添加是否检查了另一个类的某些静态字段的变量,并在配置中添加了我的类型。