我正在使用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
这适用于记录请求和响应,但我需要从信封中删除一个非常大的有问题的属性。有什么想法吗?
答案 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
handleRequest
和handleResponse
创建实施,以解析,修改和记录您的自定义消息。
以下代码委托给AbstractLoggingInterceptor
handleRequest
和handleResponse
并覆盖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 {}
}