【问题标题】:Logback - formatting spring ws soap requestsLogback - 格式化 spring ws soap 请求
【发布时间】:2015-11-15 06:57:15
【问题描述】:

这听起来像是一个愚蠢的问题,但我找不到答案,这真的让我很困扰。我正在使用 logback 进行日志记录,我目前正在使用 spring ws 处理一些肥皂请求。我想要的是在控制台(多行)中将整个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>

如何启用此功能?

【问题讨论】:

    标签: java logback spring-ws


    【解决方案1】:

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

    How to create your own appender using Log4j2

    How to pretty print XML

    还可以看看如何使用spring loggers 获得更多粒度。

    【讨论】:

      【解决方案2】:

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

      话虽如此,您可能希望添加一个自定义ClientInterceptor 来拦截每条消息。您应该实现handleRequest(MessageContext) 和/或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 消息的问题和答案,因此留给读者作为练习。

      【讨论】:

        猜你喜欢
        • 2019-10-26
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 2011-11-27
        • 2021-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多