Axis2使用logback标记SOAP请求和响应截断为4000个字符(字节)

问题描述 投票:4回答:2

我们正在尝试使用logback和以下配置记录Axis2 SOAP日志消息:

<!-- Axis client appender -->
<appender name="AxisLogging" class="ch.qos.logback.core.rolling.RollingFileAppender">
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>INFO</level>
    <OnMatch>ACCEPT</OnMatch>
    <OnMismatch>NEUTRAL</OnMismatch>
  </filter>
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>DEBUG</level>
    <OnMatch>ACCEPT</OnMatch>
    <OnMismatch>NEUTRAL</OnMismatch>
  </filter>
  <filter class="ch.qos.logback.classic.filter.LevelFilter">
    <level>TRACE</level>
    <OnMatch>ACCEPT</OnMatch>
    <OnMismatch>DENY</OnMismatch>
  </filter>

  <File>log/axis-client.log</File>
  <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
    <FileNamePattern>log/axis-client.%i.log</FileNamePattern>
    <MinIndex>1</MinIndex>
    <MaxIndex>5</MaxIndex>
  </rollingPolicy>
  <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
    <MaxFileSize>100MB</MaxFileSize>
  </triggeringPolicy>

  <encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
    <layout class="ch.qos.logback.classic.PatternLayout">
        <Pattern>[%date{yyyy-MM-dd HH:mm:ss.SSS zZ}] %-5level [%mdc{requestsite}] [%mdc{session.id}] "%thread" %msg %ex%n</Pattern>
    </layout>
  </encoder>
</appender>

<logger name="httpclient.wire.content">
  <appender-ref ref="AxisLogging"/>
</logger>

并且长请求的日志消息和响应XML在4000个字符上被截断,并通过多个日志行传播。有没有办法配置logback以在一个日志行中记录整个XML?

谢谢!

logging soap axis2 intershop
2个回答
2
投票

显然这是ReaderConfig.java(com.ctc.wstx.api.ReaderConfig.java)的问题,它负责读取(和记录Web服务响应)。正如你在这里看到的:

https://github.com/FasterXML/woodstox/blob/master/src/main/java/com/ctc/wstx/api/ReaderConfig.java

在由com.ctc.wstx.stax.WstxInputFactory启动的服务器上调用的方法createFullDefaults()中,构造的Reader的固定缓冲区长度为4000。

因此,只有在一行中需要完整的Axis2响应XML消息时,使用自定义代码进行日志记录才是解决方案。


0
投票

你确定这个限制是在回归吗?也许限制在axis2。注意:在此示例中,限制位于apache CXF库中。

Text length limit in logback logging

这就是我通常记录肥皂消息的方式。虽然需要一些编程。

String request = stub._getServiceClient().getLastOperationContext().getMessageContext("Out")
              .getEnvelope().toString());
String response = stub._getServiceClient().getLastOperationContext().getMessageContext("In")
              .getEnvelope().toString());

如果您将这些变量写入日志,那么您应该没有问题。

© www.soinside.com 2019 - 2024. All rights reserved.