Spring SLF4j 的 ws 日志记录问题
Spring ws logging issue with SLF4j
您好,我正在使用 spring ws + slf4j 进行日志记录。在 application.properties
中使用以下属性记录 soap 请求和响应
logging.level.org.springframework.ws.client.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.server.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.client.MessageTracing.received=TRACE
logging.level.org.springframework.ws.server.MessageTracing.received=TRACE
它不记录请求和响应,而是打印以下对象,
13:13:06.155 [main] DEBUG o.s.ws.client.MessageTracing.sent - Sent request [SaajSoapMessage {http://ws.sample.customer.com/}getCustomerDetails]
13:13:06.411 [main] DEBUG o.s.w.client.MessageTracing.received - Received response [SaajSoapMessage {http://ws.sample.customer.com/}getCustomerDetailsResponse] for request [SaajSoapMessage {http://ws.sample.customer.com/}getCustomerDetails]
我正在使用以下方式调用网络服务:
return (JAXBElement) getWebServiceTemplate().marshalSendAndReceive(uri, request, webServiceMessage -> {
SoapMessage soapMessage = (SoapMessage) webServiceMessage;
Marshaller marshaller = getMarshaller();
marshaller.marshal(jaxbElement, soapMessage.getSoapHeader().getResult());
});
我不知道为什么它不打印请求和响应。我还尝试使用 "SoapEnvelopeLoggingInterceptor" 或 "ClientInterceptor" 拦截请求和响应,但没有任何触发但得到了响应对象。
public class LogbackInterceptor implements ClientInterceptor {
private static final Logger logger = LoggerFactory.getLogger(LogbackInterceptor.class);
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
logger.debug("Sent request by sample [" + messageContext.getRequest() + "]");
return true;
}
public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
logger.debug("Received response by sample [" + messageContext.getResponse() + "] for request [" +
messageContext.getRequest() + "]");
return true;
}
@Override
public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
// TODO Auto-generated method stub
return false;
}
@Override
public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException {
// TODO Auto-generated method stub
}
}
@Component
public class LoggingInterceptor extends SoapEnvelopeLoggingInterceptor{
private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
protected void logMessage(String message) {
System.out.println("Entered log message");
logger.debug("LoggingInterceptor::logMessage");
logger.debug(message);
/* Example, here you could be logging to DB or whatever you want */
}
}
如果有人帮我解决这个问题就好了
终于找到解决方法希望对大家有帮助,
我们应该在 WebServiceTemplate 中注册 "ClientInterceptor",否则 spring 将不会触发 "ClientInterceptor"。下面的代码非常有效,现在我可以拦截请求和响应了。
WebServiceTemplate webServiceTemplate = getWebServiceTemplate();
ClientInterceptor[] interceptors = new ClientInterceptor[1];
interceptors[0] = new LogbackInterceptor();
webServiceTemplate.setInterceptors(interceptors);
您好,我正在使用 spring ws + slf4j 进行日志记录。在 application.properties
中使用以下属性记录 soap 请求和响应logging.level.org.springframework.ws.client.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.server.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.client.MessageTracing.received=TRACE
logging.level.org.springframework.ws.server.MessageTracing.received=TRACE
它不记录请求和响应,而是打印以下对象,
13:13:06.155 [main] DEBUG o.s.ws.client.MessageTracing.sent - Sent request [SaajSoapMessage {http://ws.sample.customer.com/}getCustomerDetails]
13:13:06.411 [main] DEBUG o.s.w.client.MessageTracing.received - Received response [SaajSoapMessage {http://ws.sample.customer.com/}getCustomerDetailsResponse] for request [SaajSoapMessage {http://ws.sample.customer.com/}getCustomerDetails]
我正在使用以下方式调用网络服务:
return (JAXBElement) getWebServiceTemplate().marshalSendAndReceive(uri, request, webServiceMessage -> {
SoapMessage soapMessage = (SoapMessage) webServiceMessage;
Marshaller marshaller = getMarshaller();
marshaller.marshal(jaxbElement, soapMessage.getSoapHeader().getResult());
});
我不知道为什么它不打印请求和响应。我还尝试使用 "SoapEnvelopeLoggingInterceptor" 或 "ClientInterceptor" 拦截请求和响应,但没有任何触发但得到了响应对象。
public class LogbackInterceptor implements ClientInterceptor {
private static final Logger logger = LoggerFactory.getLogger(LogbackInterceptor.class);
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
logger.debug("Sent request by sample [" + messageContext.getRequest() + "]");
return true;
}
public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
logger.debug("Received response by sample [" + messageContext.getResponse() + "] for request [" +
messageContext.getRequest() + "]");
return true;
}
@Override
public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
// TODO Auto-generated method stub
return false;
}
@Override
public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException {
// TODO Auto-generated method stub
}
}
@Component
public class LoggingInterceptor extends SoapEnvelopeLoggingInterceptor{
private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
protected void logMessage(String message) {
System.out.println("Entered log message");
logger.debug("LoggingInterceptor::logMessage");
logger.debug(message);
/* Example, here you could be logging to DB or whatever you want */
}
}
如果有人帮我解决这个问题就好了
终于找到解决方法希望对大家有帮助,
我们应该在 WebServiceTemplate 中注册 "ClientInterceptor",否则 spring 将不会触发 "ClientInterceptor"。下面的代码非常有效,现在我可以拦截请求和响应了。
WebServiceTemplate webServiceTemplate = getWebServiceTemplate();
ClientInterceptor[] interceptors = new ClientInterceptor[1];
interceptors[0] = new LogbackInterceptor();
webServiceTemplate.setInterceptors(interceptors);