Spring实现拦截所有接口的请求和响应日志输出

背景

        本文主要是记录大佬的实现方式以及连接

        由于接手别人的系统, 日志比较混乱, 为了方便排查问题, 想要将系统中的所有的请求和响应日志都进行输出~

介绍

        一般情况下, 就是用拦截器或者过滤器来实现请求前后日志记录, 但是因为某些特殊原因, 导致日志出现记录不全或请求响应缺失的情况, 比如, 使用

@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 过滤器和拦截器---实现全局接口日志输出

Request的包装类HttpServletRequestWrapper的使用说明

Spring在Filter中记录Web请求Request和返回Response的内容及时长

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值