如何覆盖客户端肥皂记录 - 春季启动



我正在春季启动应用程序中消费肥皂服务。响应/请求记录太大,因为一个属性太大。因此,我想拦截该记录并删除有问题的属性。

我一直在与SoapenporviceLoggingInterceptor在一起,但我认为这仅适用于服务器端的记录。它不会被捡起。

我已经配置了YML内部的肥皂记录:

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

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

您可以扩展ClientInterceptorAdapter抽象实现ClientInterceptor S和Oveeride handleRequesthandleResponse进行解析,修改和记录您的自定义消息。

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

之类的东西
public class MyInterceptor extend ClientInterceptorAdapter {
    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);
    }
}

没有简单的方法可以做到这一点。您可以通过扩展SL4J API或包装日志调用并在此处进行转换来实现自己的Logger

第一种方法将需要一些努力,因为您需要实施一批课程,并确保日志系统的其他部分未破坏。

但是第二部分是海峡的前进。您有Ti创建一个实现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类(。在这种情况下,您无需从接口中实现数量的方法,但是您会互换互换性。

此解决方案的缺点是您必须在您身边预先记录消息(不是通过MessageTracing(,但是如果可能的话,我会这样。另一方面,第一个解决方案可以从开箱即用。

最新更新