我正在春季启动应用程序中消费肥皂服务。响应/请求记录太大,因为一个属性太大。因此,我想拦截该记录并删除有问题的属性。
我一直在与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 handleRequest
和handleResponse
进行解析,修改和记录您的自定义消息。
以下代码代表AbstractLoggingInterceptor
handleRequest
和handleResponse
并覆盖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
(,但是如果可能的话,我会这样。另一方面,第一个解决方案可以从开箱即用。