Java 如何覆盖客户端Soap日志记录-Spring引导

Java 如何覆盖客户端Soap日志记录-Spring引导,java,spring,logging,soap,spring-boot,Java,Spring,Logging,Soap,Spring Boot,我正在spring boot应用程序中使用soap Web服务。响应/请求日志记录太大,因为有一个属性太大。因此,我想截取该日志记录并删除有问题的属性 我一直在玩弄SoapEnvelopeLogginInterceptor,但我认为这只是用于服务器端日志记录。它不会被捡起来 我在yml中配置了soap日志记录,如下所示: logging: pattern: ... level: ... org.springframework.ws.client.MessageTr

我正在spring boot应用程序中使用soap Web服务。响应/请求日志记录太大,因为有一个属性太大。因此,我想截取该日志记录并删除有问题的属性

我一直在玩弄SoapEnvelopeLogginInterceptor,但我认为这只是用于服务器端日志记录。它不会被捡起来

我在yml中配置了soap日志记录,如下所示:

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

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

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

第一种方法需要一些努力,因为您需要实现批处理类,并确保日志系统的其他部分没有损坏

但第二部分是相当艰难的。 您必须创建一个实现
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)
);
在代码中,您可以这样使用它:

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
类)。在这种情况下,您不需要从接口实现大量方法,但是会降低互换性


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

您可以扩展
ClientInterceptorAdapter
抽象实现
ClientInterceptor
s和oveeride
handleRequest
handleResponse
来解析、修改和记录自定义消息

下面的代码将委托给
AbstractLoggingInterceptor
HandlerRequest
HandlerResponse
,并覆盖
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);

    }

}

我理解正确了吗?您想根据消息内容从日志消息中剪切一些文本吗?或者,您希望仅在日志消息在soap信封中不包含某些特定内容的情况下显示日志,我希望将特定属性(例如)替换为dasd。。。如果删除的值太大,则在所有情况下,都会删除该属性。我对正则表达式有这样做的逻辑。我只是不知道如何连接。在这种情况下,我认为您唯一的选择是根据您自己的规范创建自己的SOAPLoggingInterceptor e管理请求和soap在跟踪级别记录请求和响应的位置附近没有连接。您可以为
ClientInterceptor
s
handleRequest
handleResponse
创建实现,以解析、修改和记录自定义消息。感谢您的回答,我会选择第二个答案,因为它更适合我的目的。我会接受这个答案,因为它似乎比@Oleksandr Spota的答案更适合我的需要(而且我已经没有赏金时间了)。我还没有机会测试它,所以我将在本周晚些时候提供进一步的反馈。谢谢。那是我用过的最好的50分。谢谢请注意:您可能会发现有必要重写EndPointInterceptor中的isLogEnabled(),因为默认情况下,它仅适用于调试级别。还要删除spring的MessageTracing属性/yml,否则您将获得双重日志记录。此外,为了省略空方法,MyInterceptor可以扩展ClientInterceptorAdapter,而不是实现ClientInterceptor