接口相关数据日志打印

接口相关数据日志打印

  为什么要写这个呢,主要是随着项目的推动,数据量的提升,各种类型问题逐渐暴露出来,有时候在接口信息排查问题的日志数据不足或者凌乱,导致排查难度升高,所以一个比较完整可靠的接口日志是非常有必要的。

  还有这个日志的打印没有什么明确的规范,完全是根据自身项目的需求所变化成长,衍生扩展有用的数据。

  其实接口分析主要的几个点:请求地址、请求方式、远端地址、类名、方法、参数、返回值等。


 相关知识点概述

  1. 首先至少需要明白拦截器和过滤器的一些简单区别,调用的先后顺序。(可参考:https://www.cnblogs.com/panxuejun/p/7715917.html

    过滤器是基于函数回调、依赖Servlet容器、对所有请求有作用、初始化调用一次、无法跟Spring容器交集

    拦截器基于反射机制、只对action起作用,对啥静态文件请求不起作用、可以获取上下文、获取Spring容器Bean对象实现业务逻辑。

    根据使用场景选择性作用

  2. 若是了解Servlet和struts会更好的理解HttpServletRequest和HttpServletResponse,主要是需要了解HttpServletRequest相关使用(可参考:https://blog.csdn.net/wwq0813/article/details/90256058

      

  3. 需要掌握APO比较重要的几个使用方式,如:Pointcut、Advice、Aspect等。(可参考:https://blog.csdn.net/q982151756/article/details/80513340

     

  4. 还要了解几个注解的意思,如:RestController、ResponseBody、RequestMapping、PostMapping、PathVariable、RequestParam等(可参考:https://blog.csdn.net/youanyyou/article/details/100013330
  5. 需要知道不同的请求方式,参数接收方式不同,
    有可能的请求方式:
    • GET/POST的方式,一般情况下,GET在URL中读取,POST在Body 中读取,使用的注解为@RequestParam和@RequestBody
    • 也有在HttpServletRequest中获取参数,queryString,getParamter等

  还有一个知识点就是了解获取远程来源的IP,一般情况下都是会用request.getRemoteAddr(),但这个可能获取的只是代理的IP,并不是真实客户端的IP,一般比较主流的代理都会加上自己的头信息,如下:

(可参考:https://blog.csdn.net/qq_33301866/article/details/108588521?utm_medium=distribute.pc_relevant.none-task-blog-title-2&spm=1001.2101.3001.4242

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

原文地址:https://www.cnblogs.com/zhouguanglin/p/13969224.html