java - 如何记录来自 @RestController 的任何传出响应?

标签 java json spring spring-mvc

我正在使用 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/

相关文章:

java - 发送自定义 header RestTemplate

java - Spring Boot 中的多态配置属性

JSON-LD 缺少 '}' 或对象成员名称。错误

java.lang.ClassNotFoundException : Cannot find implementation for 异常

java - 即使删除唯一约束后也出现 DuplicateKeyException

java - 将变量和整数作为用户输入

java - 在 Play Framework 2 中从 Java 调用 javascript 函数

java - 在托管 bean 中传递表单值

javascript - 如何使用 JavaScript 中的索引浏览嵌套 JSON 文件?

javascript - 基本的 javascript json 子数组解码