手把手教你如何优雅的使用Aop记录带参数的复杂Web接口日志

  • 时间:
  • 浏览:0

isExist的代码如下。

doAfterReturning中的getRequestParam函数后,加入以下代码。

上加完后 ,每一次调用test/{id}有一种接口,后该触发拦截器中的doAfterReturning方法中的代码。

上端介绍了记录普通日志的方法,接下来要介绍记录特定日志的方法。哪多少特定日志呢,为什么会么会让每个接口要记录的信息不同。为了实现有一种,就让 人时要实现五个 操作类型的枚举类。代码如下。

接下来实现getComplexParam方法。

我最终那末拦截所有的controller,为什么会么会让自定义了五个 日志注解。所有打上了有一种注解的方法,为什么会么会让记录日志。一起,注解中会蕴藏类型,来为当前的接口指定特定的日志内容以及参数。

将模板枚举类中的WARNING修改为如下。

我应该 参考源码的大佬请戳 ->这里<-

新建TestDTO。代码如下。

一旦得到了这条信息,就让 人就并能把它记录到任如可果 人想记录的地方。

新建五个 枚举类Type。代码如下。

并能看得人,就让 人时要记录的所有的参数,都被正确的替换了。而不时要记录的参数,同样也那末对多线程 造成影响。

为每个接口指定五个 日志无须困难,只时要为每个接口指定五个 类型即可。为什么会么会让就让 人应该也注意到了,五个 接口日志,只记录因被就让 玩家举报,警告玩家五个 的信息那末任何意义。

代码如下。

将aop类中的doAfterReturning为如下。

让就让 人试试传入不传入非必选参数,会是哪多少样。修改controller如下,把workOrderNumber改成非时要按参数。

比如,为什么会么会让请求失败了咋办 办?请求失败,在需求上将,是根本不时要记录操作日志的,为什么会么会让即使请求失败也会有返回值,就代表日志也会成功的记录。这就给后期查看日志带来了很大的困扰。

Retention注解定义了该Annotation被保留的时间长短。参数为RetentionPolicy。这些SOURCE表示只在源码中占据 ,我很多 在编译后的class文件占据 ;CLASS是该注解的默认选项。 即占据 于源码,也占据 于编译后的class文件,但我很多 被加载到虚拟机中去;RUNTIME占据 于源码、class文件以及虚拟机中,通俗就让 讲为什么会么会让并能在运行的完后 通过反射获取到。

接下来要介绍的是如可记录错综复杂参数类型的日志。嘴笨 ,大致的思路是不变的。就让 人看传入的类中的参数,有那末时要记录的。有得话就按照上端记录简单参数的方法来替换记录参数。

新建LogAspect类。代码如下。

在上端就让 人也提到过,在编译的完后 会上加getter和setter,好多好多 参数名的首字母后该变成大写,好多好多 就让 人时要就让 人实现五个 setFirstLetterUpperCase方法,来将就让 人传入的参数名的首字母变成大写。

在此处分有一种情况,有一种是简单参数类型,另外有一种是错综复杂参数类型,也为什么会么会让参数中带了请求DTO的情况。

request.png

WARNING模板修改如下。

代码如下。

就让 人并能参考我完后 写的另一篇文章,手把手教你从零开使英语 搭建SpringBoot后端项目框架。若果能请求简单的接口就并能了。本项目的依赖如下。

无须会影响多线程 的正常运行。

请求如下url。

就让 人想让aop记录的参数完整版记录到Param类中的实例中,而传入了意料之外的参数也那末让多线程 崩溃。接下里就让 人只时要将哪多少参数,将完后 定义好的模板的参数预留字段替换掉即可。

将上端的所有的参数完整版上加到Param类中,完整版定义成字符串类型。

启动项目,发起POST请求会发现,返回值如下。

为什么会么会让就并能根据需求,将上端的日志记录到相应的地方。

就让 人给完后 的controller上加上述模板中国呢的参数。部分代码如下。

为什么会么会让将getRequestParam完后 的所有操作,包括getRequestParam有一种,用success寄快件 起来。如下。

五个 的接口有好多好多 个,为什么会么会让大部分接口的参数都是一样。为什么会么会让就让 人很容易想到的五个 思路为什么会么会让,实现五个 日志记录的工具类,为什么会么会让在时要记录日志的接口中,上加一行代码。由有一种日志工具类去判断此时应该处置哪多少参数。

就让 人为什么会么会让会想到,实现五个 记录日志的方法,在要记日志的接口中调用,把参数传进去。为什么会么会让类型好多好多 得话,参数也会随之增多,每个接口的参数都是一样。处置起来十分麻烦,为什么会么会让对业务的侵入性太高。几乎每个地方都是嵌入日志相关代码。一旦涉及到修改,为什么会么会让变得十分难维护。

为什么会么会让五个 有很大的问提。为什么会么会让时要记日志的接口数量非常多,先不讨论有一种工具类中时要做多少的类型判断,仅仅是给所有接口上加五个 一行代码在我就让 人看来都是只能接受的行为。首先,五个 对代码的侵入性很多。其次,后期万一有改动,维护的人为什么会么会让十分难受。想象一下,全局搜索相同的代码,再一一进行修改。

代码如下。

为什么会么会让将doAfterReturning中的代码改成如下。

到这为什么会么会让就让 哥们就嘴笨 行了,万事具备,只欠东风。但嘴笨 五个 的实现方法,还占据 多少问提。

那末如可从众多为什么会么会让的参数中,为当前的日志指定对应的参数呢。我的处置方案是维护五个 参数类,上端列举了所有时要记录在日志中的参数名。为什么会么会让在拦截请求时,通过反射,获取到该请求的request和response中的所有参数和值,为什么会么会让该参数占据 于我维护的param类中,则将对应的值赋值进去。

上加完后 ,每一次调用加了@Log(type = "WARNING")有一种注解的接口,后该打印有一种接口所指定的日志。这些上述代码就会打印出如下代码。

实现success函数,代码如下。

下面就让 人实现replaceParam方法。

为什么会么会让在请求开使英语 后,将模板中的所有预留的参数完整版用赋了值的参数替换掉。五个 一来,在不小量的侵入业务的前提下,满足了需求,一起也保证了代码的可维护性。

文章结尾我会给出有一种demo项目的所有源码。好多好多 不看得人得人程的兄台可移步到末尾,直接看源码。(听说和源码搭配,看文章更美味...)

其中的getParam方法,这些于setParam,也是利用反射的方法,通过传入的Class和Key,获取对应的值。

而控制台的输出如下。

新建五个 类Param,其蕴藏高所有在操作日志中,为什么会么会让会出显的参数。为哪多少要那末做?为什么会么会让每个接口时要的参数都是为什么会么会让完整版不一样,与其去维护小量的判断逻辑,还不如贪心就让 ,直接传入所有的为什么会么会让参数。当为什么会么会让期为什么会么会让有新的参数时要记录,则时要修改代码。

好多好多 我放弃了有一种略显原始的方法。我最终采用了Aop的方法,采取拦截的请求的方法,来记录日志。为什么会么会让即使采用有一种方法,仍然面临五个 问提,那为什么会么会让如可处置小量的参数。以及如可对应到每五个 接口上。

启动项目,为什么会么会让请求controller中的方法。为什么会么会让传入定义好的参数。

getRequestParam后,上加方法getResponseParam,直接调用完后 写好的函数。代码如下。

五个 的日志做了很多的无用功,根本那末方法在出显问提完后 溯源。好多好多 就让 人下一步的操作为什么会么会让给每个接口上加特定的参数。那末就让 人为什么会么会让会有问提,为什么会么会让每个接口的参数几乎都是一样,那有一种工具类简直要传入好多好多 参数,要咋办 实现呢,甚至时要组织参数,五个 会小量的侵入业务代码,为什么会么会让会小量的增加冗余代码。

TargetRetention都属于元注解。共有4种,分别是@Retention@Target@Document@Inherited

该函数使用反射的方法,获取该参数的set方法,将Param类中对应的参数设置成传入的值。

其中的参数,为什么会么会让要在aop拦截阶段获取为什么会么会让替换掉的参数。

Target注解说明了该Annotation所修饰的范围。并能传入好多好多 类型,参数为ElementType。这些TYPE,用于描述类、接口为什么会么会让枚举类;FIELD用于描述属性;METHOD用于描述方法;PARAMETER用于描述参数;CONSTRUCTOR用于描述构造函数;LOCAL_VARIABLE用于描述局部变量;ANNOTATION_TYPE用于描述注解;PACKAGE用于描述包等。

为什么会么会让并能看得人,控制台的输出如下。

不久前,为什么会么会让需求的由于,时要实现五个 操作日志。几乎每五个 接口被调用后,都是记录一根绳子 绳子 跟有一种参数挂钩的特定的日志到数据库。举个例子,就比如禁言操作,日志中时要记录为什么会么会让哪多少禁言,被禁言的人的id和各种信息。方便后期查询。

上一步提到了自定义注解,有一种自定义注解将打在controller的每个方法上。新建五个 annotation的类。代码如下。

再比如,为什么会么会让我时要的参数在返回值中咋办 办?为什么会么会我应该 那末用统一的生成唯一id的服务,就会遇到有一种问提。就比如我时要往数据库中插入一根绳子 绳子 新的数据,我时要得到数据库自增id,而就让 人的日志拦截只拦截了请求中的参数。好多好多 这为什么会么会让就让 人接下来要处置的问提。

代码如下。

convertToMap方法将模板中的所有预留字段完整版提取出来,当作五个 Map的Key。

上述代码中,遍历请求所传入的参数名,为什么会么会让就让 人实现isExist方法, 来判断有一种参数在就让 人的Param类蕴藏无占据 ,为什么会么会让占据 就让 人就再调用setRequestParamValueIntoParam方法,将有一种参数名所对应的参数值写入到Param类的实例中。

给时要记录日志的接口上加Log注解。

记录日志的人倒不嘴笨 ,而最后去查看日志的人就要吾日三省吾身了,被谁举报了?为什么会么会让哪多少举报了?我警告的谁?

再次发起POST请求,并能发现控制台的输出如下。

给aop类上加多少私有变量。

首那末做的为什么会么会让拦截打上了自定义注解的请求。就让 人并能获取到请求的详情,以及请求中的所有的参数名,以及参数。下面就让 人就来实现上述代码中的getRequestParam方法。

流程图如下所示。

代码如下。

给上端的controller中的注解上加type。代码如下。

五个 一来,就并能保证只能在请求成功的前提下,才会记录日志。

并能看得人,id那末被获取到。好多好多 就让 人还时要上加五个 函数,从返回值中获取id的数据。

Pointcut中传入了五个 注解,表示凡是打上了有一种注解的方法,后该触发由Pointcut修饰的operationLog函数。而AfterReturning则是在请求返回完后 触发。

好多好多 我直接利用反射获取aop拦截到的请求中的所有参数,为什么会么会让我的参数类(所有要记录的参数)上端有请求中的参数,那末让人将参数的值写入参数类中。最后将日志模版中参数预留字段替上加请求中的参数。

ArrayUtilhutool中的五个 工具函数。用来判断在五个 元素在数组中的下标。

运行完后 ,并能看得人控制台打印的信息如下。

启动项目。使用postman对上端的url发起POST请求。请求body中带上TestDTO中的参数。请求成功返回后就会看得人控制台输出如下。

再次请求上述的url,则并能看得人控制台的输出如下。

GET请求总共传入了五个 参数,分别是id,workOrderNumber,userId, name。就让 人并能看得人,在Param类中并那末定义name有一种字段。这是特意加了五个 不时要记录的参数,来验证就让 人接口的健壮性的。

代码如下。

下面我为什么会么会让把完整版的实现过程列举出来。

在五个 项目中,就让 人用五个 类来统一返回值。