Logback - 格式化 spring ws soap 请求

Logback - formatting spring ws soap requests

这听起来像是一个愚蠢的问题,但我找不到答案,这真的很困扰我。我正在使用 logback 进行日志记录,目前正在使用 spring ws 处理一些 soap 请求。我想要的是在控制台(多行)中将整个 soap 请求记录为格式良好的 xml 。我已经为 "org.springframework.ws" 添加了 "trace" 级别的记录器,我得到的是每个请求恰好一行。

我的logback.xml:

<configuration>
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>

    <root level="error">
        <appender-ref ref="STDOUT" />
    </root>

    <logger name="org.springframework.ws" level="trace" />
</configuration>

如何启用此功能?

大多数 SOAP 库,包括 Spring-WS,在发送之前不会格式化消息。换行符、制表符和空格与接收方无关,它节省了一些带宽。

话虽如此,您可能想要添加一个自定义 ClientInterceptor 来拦截每条消息。您应该实施 handleRequest(MessageContext) and/or handleResponse(MessageContext)(取决于您是发送还是接收消息)。

要获取原始 XML,请编写如下代码:

final ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
    message.writeTo(baos);
} catch (IOException ioe) {
    log.error("Could not intercept payload", ioe);
    throw new WebServiceIOException("Could not intercept payload", ioe);
}
final String payload = baos.toString("UTF-8");

SO 上有很多关于格式化 XML 消息的问题和答案,因此留给 reader.

作为练习。

最简单但最方便和最强大的解决方案是创建您自己的 Log4j 附加程序以漂亮地打印您的 XML 消息。它为您提供了强大的配置可能性,而不会膨胀您的网络堆栈:

How to create your own appender using Log4j2

How to pretty print XML

另请查看如何使用 spring loggers 获得更多粒度。