Log4 使用 HEX 代码记录 HTTP 响应

Posted

技术标签:

【中文标题】Log4 使用 HEX 代码记录 HTTP 响应【英文标题】:Log4 logging HTTP responses with HEX codes 【发布时间】:2014-09-16 08:08:19 【问题描述】:

HTTP 客户端请求以常规 ASCII 记录,但响应以十六进制代码记录。我设置了我的 log4j 文件,就像另一个没有这个问题的应用程序一样。

httpclient.wire.content >> </soap:Envelope>
...
httpclient.wire.content << "[0x1f][0x8b][0x8][0x0][0x0][0x0][0x0][0x0][0x0][0x0][0x93][0xc1]N[0xc3]0[0xc][0x86][0xef]<E[0xe9][0xbd]M[0xcb][0xc4][0xa5]*E m[0x82][0x3]Lb[0xbc]@XM[0x89][0xd4]&!N[0xd3][0x8d][0xa7]G[0xed][0x9a]-[0xe9][0xd6][0xdd][0xe2][0xdf][0x9f][0xed]8vr[0x14]TfKn[0xa0][0x16][0x12][0x82]]Ss[0xcc]z[0xed]![0xfc][0xd1]Zf[0x84]t][0x17]w[0x8b]X[0xa8][0x8a][0xdc]%[0xc9][0x82]$[0xf7][0xa4][0xf7]G0[0xc6][0x84]c[0x90]I[0x8f]![0x86][0x81][0xc2][0xd8][0xd0][0xb8][0x12][0x86][0xc0]7"1iX[0xdc][0x4]A[0x90][0xf][0xe5]^[0x80][0x96][0xa0][0x88][0xa3]<[0x8b]r?[0x98][0xbd]b[0xd2][0xc][0xdb][0xaf][0x86][0xe9][0x95]P[0xcd][0x7][0xa0][0x14][0x1c][0xe1][\r][0x10]i[0x5][0x16][0x1a]9[0xa1]X[0xc5]8[0xd5]L[0xf0][0xd7][0xb2]x[0xcc][0xc9][0x99][0xe6][0xf3]C^D[0x17][0xf7]$[0x9f][0xd6][0x8a]r[0x9c][0xf2][0x13][0xd1][0x8f]P[0xf0][0xdb][0x2][0xea]#|[0xb2]g[0xee][0xcd][0xab][0xb5][0xaa](g^?[0xc3][0xdf]i[0x3][0xd3]..[0x10]N[0xae][0xdb

【问题讨论】:

您在标头中请求什么 mime-type/content-type? @Robert Rowntree,我正在发送“Content-Type: text/xml;charset=UTF-8” 你在响应中得到 'application/...'。这可能就是线路记录器转储十六进制的原因。 这就是响应中的内容。很明显,您没有发送标头表明您将接受“文本” @Robert Rowntree,这是有道理的。我们使用模拟作为响应,它可能对类型进行硬编码。您是否在线使用了十六进制到字符串转换器?我尝试使用一个,但得到了一堆特殊字符。 【参考方案1】:

接受编码:gzip,deflate

您的请求标头中的上述内容会导致您描述的症状,原因如下:

服务器可以在响应进入 WIRE 之前使用装饰器对响应进行 GZIP 处理

您的回复过程应该用interceptor todo GUNZip 装饰。

不知道这会使 WIRE 记录器处于什么状态。

我只需要在“parse.com”上将拦截器添加到我的一些请求中并注意到了这一点。 我还不知道记录器处于什么状态。你可能需要更多地关注它。但是应该检查您的响应拦截器,因为它可能涉及相同的事情。

当它们出现在 parse.com 的 android 应用程序中时,我的回复(那些显示在 WIRE logger asHEX 中的 gzip 文件)只是挂起。正如您在代码链接中看到的那样,刚刚修复了响应实体上的包装器。

【讨论】:

【参考方案2】:

因为您使用的是 apache http。所以登录“org.apache.http.impl.conn.Wire”就是用十六进制转义特殊字符。

    private void wire(final String header, final InputStream inStream)
  throws IOException 
    final StringBuilder buffer = new StringBuilder();
    int ch;
    while ((ch = inStream.read()) != -1) 
        if (ch == 13) 
            buffer.append("[\\r]");
         else if (ch == 10) 
                buffer.append("[\\n]\"");
                buffer.insert(0, "\"");
                buffer.insert(0, header);
                log.debug(id + " " + buffer.toString());
                buffer.setLength(0);
         else if ((ch < 32) || (ch > 127)) 
            buffer.append("[0x");
            buffer.append(Integer.toHexString(ch));
            buffer.append("]");
         else 
            buffer.append((char) ch);
        
    
    if (buffer.length() > 0) 
        buffer.append('\"');
        buffer.insert(0, '\"');
        buffer.insert(0, header);
        log.debug(id + " " + buffer.toString());
    

【讨论】:

以上是关于Log4 使用 HEX 代码记录 HTTP 响应的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Log4J 掩盖日志文件中的信用卡号?

异常处理——把异常记录下来,log4j的使用

Spring中使用Log4j记录日志

项目中记录log4j记录日志

Java使用Log4记录日志

多线程代码执行的 Log4Net C# 日志记录问题