如何覆盖客户端肥皂日志 - Spring Boot

时间:2017-06-01 12:00:17

标签: java spring logging soap spring-boot

我正在使用spring boot应用程序中的soap webservice。响应/请求日志记录太大,因为一个属性太大。所以我想拦截记录并删除有问题的属性。

我一直在搞乱SoapEnvelopeLoggingInterceptor,但我认为这仅适用于服务器端日志记录。它不会被拿起来。

我在yml中配置了肥皂记录,如下所示:

logging:
  pattern:
    ...
  level:
    ...
    org.springframework.ws.client.MessageTracing.sent: TRACE
    org.springframework.ws.client.MessageTracing.received: TRACE
    org.springframework.ws.server.MessageTracing: DEBUG

这适用于记录请求和响应,但我需要从信封中删除一个非常大的有问题的属性。有什么想法吗?

2 个答案:

答案 0 :(得分:2)

没有简单的方法可以做到这一点。您可以通过extending sl4j API实现自己的Logger或包装日志调用并在那里进行转换。

第一种方法需要付出一些努力,因为你需要实现一批类,并确保日志系统的其他部分不会被破坏。

但第二部分是相当紧张的前进。 你有一个创建一个实现Logger接口的记录器包装器,可能是这样的:

public class LoggerWrapper extends MarkerIgnoringBase {
    private final Logger logger;

    public LoggerWrapper(Logger logger) {
        this.logger = logger;
    }

    private String transformMessage(String input) {
        // do all needed regexp transformations here
    }

    @Override
    public void debug(String msg) {
        String transformedMessage = transformMessage(msg);
        // delegate log call to inner logger
        logger.debug(transformedMessage);
    }

    // implement the rest of the methods here
}

在代码中你可以像这样使用它:

private static final Logger log = new LoggerWrapper(
        LoggerFactory.getLogger(SomeClass.class)
);

您也可以在不实现Logger接口的情况下包装记录器(在我的情况下,它是MarkerIgnoringBase类)。在这种情况下,您不需要从界面实现多个方法,但是您将l互换。

此解决方案的缺点是您必须提前记录消息(不是通过MessageTracing),但如果有可能,我会这样做。另一方面,第一种解决方案是开箱即用的。

答案 1 :(得分:2)

您可以为ClientInterceptor handleRequesthandleResponse创建实施,以解析,修改和记录您的自定义消息。

以下代码委托给AbstractLoggingInterceptor handleRequesthandleResponse并覆盖logMessage以创建自定义消息。

这样的东西
public class MyInterceptor implements ClientInterceptor {

    private final Logger logger = LoggerFactory.getLogger(MyInterceptor.class);

    private EndpointInterceptor endpointInterceptor = new AbstractLoggingInterceptor() {
        @Override
        protected Source getSource(WebServiceMessage webServiceMessage) {
            // Base logic same as SoapEnvelopeLoggingInterceptor getSource method.You can adjust to your preference.
            if(webServiceMessage instanceof SoapMessage) {
                SoapMessage soapMessage = (SoapMessage)webServiceMessage;
                return soapMessage.getEnvelope().getSource();
            } else {
                return null;
            }
        }
        @Override
        protected void logMessage(String message) {
            // You can use your regex to remove the attribute and log the message.
            this.logger.debug(message);
        }
    };

    @Override
    public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
        return endpointInterceptor.handleRequest(messageContext, null);

    }

    @Override
    public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
        return endpointInterceptor.handleResponse(messageContext, null);

    }

    @Override
    public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
        return true;
    }

    @Override
    public void afterCompletion(MessageContext messageContext, Exception e) throws WebServiceClientException {}
}