我正在使用 CommonsRequestLoggingFilter
记录 @RestController
上的所有传入请求。
@RestController
public class MyController {
@PostMapping("/")
public MyRsp ping() {
...
return myRsp;
}
}
用户将发送 POST JSON
请求,这些请求已使用以下方式记录:
@Bean
public CommonsRequestLoggingFilter requestLoggingFilter() {
CommonsRequestLoggingFilter filter = new CommonsRequestLoggingFilter();
filter.setIncludeClientInfo(true);
filter.setIncludeQueryString(true);
filter.setIncludePayload(true);
return filter;
}
问题:如何对发送回用户的 JSON 响应实现相同的效果?
最佳答案
我不知道为什么 spring 提供了一个使用 ContentCachingRequestWrapper 的休息记录器,但不提供响应日志记录。因为它的实现方式与 req 日志记录非常相似,如下所示:
public class MyFilter extends CommonsRequestLoggingFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) {
//same mechanism as for request caching in superclass
HttpServletResponse responseToUse = response;
if (isIncludePayload() && !isAsyncDispatch(request) && !(response instanceof ContentCachingResponseWrapper)) {
responseToUse = new ContentCachingResponseWrapper(response);
}
//outgoing request is logged in superclass
super.doFilterInternal(request, responseToUse, filterChain);
//log incoming response
String rsp = getResponseMessage(responseToUse);
LOGGER.info(rsp);
}
//equivalent to super.createMessage() for request logging
private String getResponseMessage(HttpServletResponse rsp) {
StringBuilder msg = new StringBuilder();
ContentCachingResponseWrapper wrapper =
WebUtils.getNativeResponse(request, ContentCachingResponseWrapper.class);
if (wrapper != null) {
byte[] buf = wrapper.getContentAsByteArray();
if (buf.length > 0) {
int length = Math.min(buf.length, getMaxPayloadLength());
String payload;
try {
payload = new String(buf, 0, length, wrapper.getCharacterEncoding());
}
catch (UnsupportedEncodingException ex) {
payload = "[unknown]";
}
msg.append(";payload=").append(payload);
}
}
}
}
关于java - 如何记录来自 @RestController 的任何传出响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44026335/