C# 跟踪截断长消息

2023-12-31

在 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>

但是较长的消息会被截断(长如 12 Kb/30 行,而不长如 1GB!),因此我最终会遇到仅记录部分 Web 请求标头的情况。

如何解决这个问题?

或者您是否知道详细解释 .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=...}.

这是一条消息,不知何故Write方法上的TraceListener被称为将单个消息作为被截断的参数(末尾的“...}.”)

而且 cookies 写得很糟糕,几乎无法解析,但我可以忍受......

是的,遗憾的是,除了篡改 System.dll 或使用一些奇怪且复杂的类型继承之外,没有什么可做的。


您将无法获得额外的数据。

您的典型示例来自一个名为的私有方法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所有的努力和记忆都被浪费了。

When SR.GetString参与日志记录,您将面临数据被截断的风险。了解发生这种情况的唯一方法是检查装配体或.Net 参考源 http://referencesource.microsoft.com/#System/net/System/Net/_Connection.cs,2557

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

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C# 跟踪截断长消息 的相关文章