<div id="navCategory"></div>
讯享网
在进行开发时,会遇到以下问题
要记录请求参数,在每个接口中加打印和记录数据库日志操作,影响代码质量,也不利于修改
使用AOP记录日志
为解决这类问题,这里使用AOP进行日志记录
然后在执行时就会发现,前置通知没有打印内容
2019-12-25 22:08:27.875 INFO 4728 --- [nio-9004-exec-1] com.zero.check.aspect.WebLogAspect : get Post Request Parameter err : Stream closed
2019-12-25 22:08:27.875 INFO 4728 --- [nio-9004-exec-1] com.zero.check.aspect.WebLogAspect : REQUEST:
2019-12-25 22:08:27.922 INFO 4728 --- [nio-9004-exec-1] c.z.c.controller.DataCheckController : Response : {"id":"1","roleId":2,"userList":[{"userId":"1","userName":"2"}]}
2019-12-25 22:08:27.937 INFO 4728 --- [nio-9004-exec-1] com.zero.check.aspect.WebLogAspect : RESPONSE: {"code":"ok","data":"Hello UserInfo(id=1, userList=[User(userId=1, userName=2)], roleId=2)","requestid":"bbac6bacb224f61a75af70ec"}
原因在ByteArrayInputStream的read方法中,其中有一个参数pos是读取的起点,在接口使用了@RequestBody获取参数,就会导致AOP中获取到的InputStream为空
以下代码用于测试读取InputStream
调用inputStream.read(new byte[6]);打印结果
7890
不调用inputStream.read(new byte[6]);打印结果
正常情况下,可以使用InputStream的reset()方法重置读取的起始点,但ServletInputStream不支持这个方法,所以ServletInputStream只能读取一次。
要多次读取ServletInputStream的内容,可以实现一个继承HttpServletRequestWrapper的方法RequestWrapper,并重写里面的getInputStream方法,这样就可以多次获取输入流,如果要对请求对象进行封装,可以在这里进行。
实现一个新的过滤器,在里面使用复写后的requestWrapper,就可以实现ServletInputStream的多次读取,如果要对请求对象进行鉴权,可以在这里进行。
POSTMAN
接口
请求方式 post
请求参数
AOP打印日志
可以看到WebLogAspect成功打印了请求和返回结果
2019-12-25 23:48:45.047 INFO 17236 --- [nio-9004-exec-5] com.zero.check.aspect.WebLogAspect : REQUEST: {
"id": "1",
"roleId": 2,
"userList": [
{
"userId": "1",
"userName": "2"
}
]
}
2019-12-25 23:48:45.047 INFO 17236 --- [nio-9004-exec-5] com.zero.check.aspect.WebLogAspect : RESPONSE: {"code":"ok","data":"Hello UserInfo(id=1, userList=[User(userId=1, userName=2)], roleId=2)","requestid":"3a219b741a704f95a844faa10c3968f8"}
返回参数
JUNIT
DateCheckServiceApplicationTests
DataCheckControllerTest

AOP打印参数
2019-12-26 00:18:11.136 INFO 13016 — [ main] com.zero.check.aspect.WebLogAspect : REQUEST: {
"id": "1",
"roleId": 2,
"userList": [
{
"userId": "1",
"userName": "2"
}
]
}
2019-12-26 00:18:11.542 INFO 13016 — [ main] com.zero.check.aspect.WebLogAspect : RESPONSE: {"code":"ok","data":"Hello UserInfo(id=1, userList=[User(userId=1, userName=2)], roleId=2)","requestid":"68c469da937ef39d3c6ceccf"}Process finished with exit code 0
代码Git地址
:A-mantis/SpringBootDataCheck.git
以上就是SpringBoot使用AOP实现日志记录功能详解的详细内容,更多关于SpringBoot AOP日志记录的资料请关注脚本之家其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/137875.html