接口相关数据日志打印
接口相关数据日志打印
为什么要写这个呢,主要是随着项目的推动,数据量的提升,各种类型问题逐渐暴露出来,有时候在接口信息排查问题的日志数据不足或者凌乱,导致排查难度升高,所以一个比较完整可靠的接口日志是非常有必要的。
还有这个日志的打印没有什么明确的规范,完全是根据自身项目的需求所变化成长,衍生扩展有用的数据。
其实接口分析主要的几个点:请求地址、请求方式、远端地址、类名、方法、参数、返回值等。
相关知识点概述
- 首先至少需要明白拦截器和过滤器的一些简单区别,调用的先后顺序。(可参考:https://www.cnblogs.com/panxuejun/p/7715917.html)
过滤器是基于函数回调、依赖Servlet容器、对所有请求有作用、初始化调用一次、无法跟Spring容器交集
拦截器基于反射机制、只对action起作用,对啥静态文件请求不起作用、可以获取上下文、获取Spring容器Bean对象实现业务逻辑。
根据使用场景选择性作用
- 若是了解Servlet和struts会更好的理解HttpServletRequest和HttpServletResponse,主要是需要了解HttpServletRequest相关使用(可参考:https://blog.csdn.net/wwq0813/article/details/90256058)
- 需要掌握APO比较重要的几个使用方式,如:Pointcut、Advice、Aspect等。(可参考:https://blog.csdn.net/q982151756/article/details/80513340)
- 还要了解几个注解的意思,如:RestController、ResponseBody、RequestMapping、PostMapping、PathVariable、RequestParam等(可参考:https://blog.csdn.net/youanyyou/article/details/100013330)
- 需要知道不同的请求方式,参数接收方式不同,
有可能的请求方式:
-
- GET/POST的方式,一般情况下,GET在URL中读取,POST在Body 中读取,使用的注解为@RequestParam和@RequestBody
- 也有在HttpServletRequest中获取参数,queryString,getParamter等
还有一个知识点就是了解获取远程来源的IP,一般情况下都是会用request.getRemoteAddr(),但这个可能获取的只是代理的IP,并不是真实客户端的IP,一般比较主流的代理都会加上自己的头信息,如下:
X-Forwarded-For
X-Forwarded-For 是一个 HTTP 扩展头部标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用。只有在通过了 HTTP 代理或者负载均衡服务器时才会添加该项。
X-Forwarded-For: client, proxy1, proxy2
一般情况下,第一个ip为客户端真实ip,后面的为经过的代理服务器ip。
Proxy-Client-IP
这个一般是经过apache http服务器的请求才会有,用apache http做代理时一般会加上Proxy-Client-IP请求头,而WL- Proxy-Client-IP是他的
WL- Proxy-Client-IP
weblogic插件加上的请求头头
HTTP_CLIENT_IP
有些代理服务器会加上此请求头
X-Real-IP
nginx代理一般会加上此请求头
接口相关数据
接口请求数据打印:
请求地址、请求方式、远端地址、类名、方法、参数
接口返回数据打印:
类、方法、返回值、耗时
接口数据打印的原则:
-
- 不能影响到业务逻辑
- 对业务结果不能轻易改动
- 输出有效分析数据,打印规范有效
- 不能对服务性能产生影响
- 有效、有价值数据可以规范JSON格式输出
主要设计思路
1、利用AOP环绕增强@RequestMapping注解,因为每个接口至少都会有这个吧,不管是隐性还是显性的。
2、获取到当前线程的HttpServletRequest、请求参数、地址、IP信息、再组装好信息打印,注意疏漏的小细节点
3、需要注意的是,若有参数HttpServletRequest存在,不能直接打印,会出错。
4、打印返回数据。
5、数据打印主要以JSON格式,以便后期调查就有价值数据分析。
后期可扩展方向
- 对有价值性数据把控可以进行存库或大数据分析
- IP也可以利用防止恶意攻击和频繁请求
- 也可以进行链路追踪
GitHub相关代码地址:https://github.com/LiZhouYan/methodLogAdvice/blob/main/MethodLogAdvice.java