背景
本文主要是记录大佬的实现方式以及连接
由于接手别人的系统, 日志比较混乱, 为了方便排查问题, 想要将系统中的所有的请求和响应日志都进行输出~
介绍
一般情况下, 就是用拦截器或者过滤器来实现请求前后日志记录, 但是因为某些特殊原因, 导致日志出现记录不全或请求响应缺失的情况, 比如, 使用
@ControllerAdvice时, @ExceptionHandler(value = {Exception.class})时, 异常情况直接被拦截并返回导致在过滤器中拿不到响应或者读出请求响应后, 存在流重复读问题
解决方式
两种方式本质上都是对request和response的包装, 在数据传输时留存一份使用
方式1
使用request和response的包装类, 参考下面链接即可, 不过需要注意的是, 由于网上实现的大多数都是针对请求体的包装, 如果自己需要针对表单请求也包装的话, 则需要自己实现
方式2
翻文章的过程中, 看到说使用request和response的包装类, 想着spring应该有相关的实现吧, 所以在spring工程中找了下, 找到了2个类...
ContentCachingRequestWrapper, ContentCachingResponseWrapper
使用getContentAsByteArray获取请求体或响应体中的内容
不过有两点需要注意下
- request在获取数据时需要在doFilter之后再执行, 否则获取数据为空
- response使用完后需要手动调用copyBodyToResponse()方法, 否则响应为空
建议使用OncePerRequestFilter过滤器, 在shouldNotFilter中过滤掉不需要处理的请求
参考
SpringBoot 过滤器和拦截器---实现全局接口日志输出