2016-07-04 65 views
4

在C#中,我启用了跟踪和网络跟踪源。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> 

但较长的消息被截断(长的很像12KB/30日线,没多久就像1GB!),所以我在这里唯一的网络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; Max-Age=0,uid=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/,uid=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.zamunda.net,pass=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0,pass=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/,pass=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.zamunda.net,bitbucketz=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0,bitbucketz=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/,bitbucketz=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/; domain=.zamunda.net,cats=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0,cats=deleted; expires=Thu, 01-Jan-1970 00:00:01 GMT; Max-Age=0; path=/,cats=deleted; 
expires=...}. 

这是一个消息,在不知何故TraceListenerWrite方法被称为丝毫该正被截断单个消息做为参数(“...}”结尾)

而且饼干可怕的书面和几乎是不可分析的,但我可以忍受......

呀,可悲的是从System.dlls篡改或使用一些奇怪的和复杂的类型继承除了没有太多成为 完成。

+0

这不正是“maxdatasize”的用途吗? 1024似乎有点低。 – spender

+0

这么想的,用32768和20000试了一下,但显然不是这样的,或者有一些其他属性必须设置,但我无法找到属性列表。奇怪的方式更大的网页html被输出为hex而不被截断,但我还没有测试过这是否发生在一条消息中。 – JDE

+0

如果你只对webrequests感兴趣,为什么你不使用[Fiddler](http://www.telerik.com/fiddler) – rene

回答

3

你不会得到额外的数据。

你典型的例子是从名为ParseResponseData的私有方法,它调用这个未来:

Logging.PrintInfo(Logging.Web, this, SR.GetString("net_log_received_headers", new object[] 
    { 
     this.m_ResponseData.m_ResponseHeaders.ToString(true) 
    })); 

内部密封静态类SR与方法GetString是这里的罪魁祸首。 net_log_received_headers资源字符串是收到的标题{{{0}}}。。 ILSpy显示验证码:

public static string GetString(string name, params object[] args) 
{ 
    SR sR = SR.GetLoader(); 
    if (sR == null) 
    { 
     return null; 
    } 
    string @string = sR.resources.GetString(name, SR.Culture); 
    if (args != null && args.Length != 0) 
    { 
     for (int i = 0; i < args.Length; i++) 
     { 
      string text = args[i] as string; 
      if (text != null && text.Length > 1024) 
      { 
       args[i] = text.Substring(0, 1021) + "..."; 
      } 
     } 
     return string.Format(CultureInfo.CurrentCulture, @string, args); 
    } 
    return @string; 
} 

你注意到这片:

if (text != null && text.Length > 1024) 
{ 
    args[i] = text.Substring(0, 1021) + "..."; 
} 

你在它扔什么都,这将改写参数长度1024个字以内。

由于ResponseHeaders集合将其所有名称/值写入单个字符串,一旦将其交给SR.GetString,所有这些努力和内存都将浪费。

SR.GetString参与日志记录时,您可能会将数据截断。知道在哪里发生这种情况的唯一方法是通过检查组件或.Net Reference Source

当内部Logging类的Dump方法被称为在配置的maxdatasize设置使用。但是,您不必猜测数据是否被截断,因为它会告诉您在日志文件中:

int maxDumpSizeSetting = Logging.GetMaxDumpSizeSetting(traceSource); 
if (length > maxDumpSizeSetting) 
{ 
    Logging.PrintLine(traceSource, TraceEventType.Verbose, 0, string.Concat(new string[] 
    { 
     "(printing ", 
     maxDumpSizeSetting.ToString(NumberFormatInfo.InvariantInfo), 
     " out of ", 
     length.ToString(NumberFormatInfo.InvariantInfo), 
     ")" 
    })); 
    length = maxDumpSizeSetting; 
}