2016-07-04 11 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> 

しかし、長いメッセージは切り捨てられ得る(ない長い1ギガバイトのように、長い12KB/30行と同じように!)ので、私は、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; 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=...}. 

これは一つのメッセージであり、TraceListenerに何とかWriteメソッドをパラメータとして単一のメッセージが切り捨てされていることを聖霊降臨祭と呼ばれている(末尾に「...}」)

またクッキーがひどく書かれており、ほとんど解析できないですが、私はそれと一緒に暮らすことができます...

うん、悲しいことに十分離れてSystem.dllsの改ざんや、いくつかの奇妙なと複合型の継承を使用してから、多くはありませんされていますすることが 完了しました。

+0

これは正確に 'maxdatasize'とは異なりますか? 1024はやや低いようです。 – spender

+0

32768と20000で試してみましたが、明らかにそうでないか、設定する必要がある他の属性がありますが、属性のリストを見つけることができません。奇妙な方法で、より大きいWebページhtmlが切り捨てられずに16進数として出力されていますが、これが1つのメッセージで発生するかどうかはテストしていません。 – JDE

+0

あなたがウェブリクエストに興味があるのであれば、[Fiddler](http://www.telerik.com/fiddler)を使わないでください。 – rene

答えて

3

あなたは余分なデータを取得しません。

あなたの典型的な例は、これを呼び出すParseResponseDataと呼ばれるプライベートメソッドから来ている:メソッドGetString

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

内部の密封された静的クラスSRがここに犯人です。 net_log_received_headersリソース文字列はです。受信したヘッダー{{{0}}}です。。あなたがこの作品に気づく

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文字までの長さを制限するために引数を書き換えますILSpyは、このコードを明らかにしています。

ResponseHeadersコレクションは、すべての名前/値を単一の文字列に書き込むため、一度手渡されるとSR.GetStringになり、そのすべての労力とメモリが無駄になります。

SR.GetStringがログに含まれていると、データを切り捨てる危険性があります。それが起こる場所を知るための唯一の方法は、内部LoggingクラスのDumpメソッドが呼び出されたときにconfigにmaxdatasize設定が使用されているアセンブリまたは.Net Reference Source

を検査することによるものです。しかし、データが切り捨てられているかどうかを推測する必要はありません。

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; 
} 
関連する問題