Java 如何覆盖客户端Soap日志记录-Spring引导
我正在spring boot应用程序中使用soap Web服务。响应/请求日志记录太大,因为有一个属性太大。因此,我想截取该日志记录并删除有问题的属性 我一直在玩弄SoapEnvelopeLogginInterceptor,但我认为这只是用于服务器端日志记录。它不会被捡起来 我在yml中配置了soap日志记录,如下所示: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
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和oveeridehandleRequest
和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
shandleRequest
和handleResponse
创建实现,以解析、修改和记录自定义消息。感谢您的回答,我会选择第二个答案,因为它更适合我的目的。我会接受这个答案,因为它似乎比@Oleksandr Spota的答案更适合我的需要(而且我已经没有赏金时间了)。我还没有机会测试它,所以我将在本周晚些时候提供进一步的反馈。谢谢。那是我用过的最好的50分。谢谢请注意:您可能会发现有必要重写EndPointInterceptor中的isLogEnabled(),因为默认情况下,它仅适用于调试级别。还要删除spring的MessageTracing属性/yml,否则您将获得双重日志记录。此外,为了省略空方法,MyInterceptor可以扩展ClientInterceptorAdapter,而不是实现ClientInterceptor