SpringBoot通过自定义注解实现日志打印的示例代码
创始人
2024-11-16 20:20:41
0次

前言

在我们日常的开发过程中通过打印详细的日志信息能够帮助我们很好地去发现开发过程中可能出现的Bug,特别是在开发Controller层的接口时,我们一般会打印出Request请求参数和Response响应结果,但是如果这些打印日志的代码相对而言还是比较重复的,那么我们可以通过什么样的方式来简化日志打印的代码呢?

SpringBoot 通过自定义注解实现权限检查可参考我的博客:SpringBoot 通过自定义注解实现权限检查

正文

Spring AOP

Spring AOP 即面向切面,是对OOP面向对象的一种延伸。
AOP机制可以让开发者把业务流程中的通用功能抽取出来,单独编写功能代码。在业务流程执行过程中,Spring框架会根据业务流程要求,自动把独立编写的功能代码切入到流程的合适位置。

我们通过AOP机制可以实现:Authentication 权限检查、Caching 缓存、Context passing 内容传递、Error handling 错误处理、日志打印等功能,这里我们讲一下怎么用Spring AOP来实现日志打印。

SpringBoot通过自定义注解实现日志打印

Maven依赖



  org.projectlombok
  lombok
  1.18.2
  true




 org.springframework.boot
 spring-boot-starter-aop

ControllerMethodLog.class自定义注解

  • @Retention: 用来修饰注解,是注解的注解,称为元注解。
  • @Target:用来说明对象的作用范围
  • @Documented:用来做标记使用
/**
* 自定义注解用于打印Controller层方式日志
*/
@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD})
public @interface ControllerMethodLog {
}

这里特别讲一下@Retention,按生命周期来划分可分为3类:

  • RetentionPolicy.SOURCE:注解只保留在源文件,当Java文件编译成class文件的时候,注解被遗弃(运行时去动态获取注解信息);
  • RetentionPolicy.CLASS:注解被保留到class文件,但jvm加载class文件时候被遗弃,这是默认的生命周期(在编译时进行一些预处理操作);
  • RetentionPolicy.RUNTIME:注解不仅被保存到class文件中,jvm加载class文件之后,仍然存在(做一些检查性的操作);

这3个生命周期分别对应于:Java源文件(.java文件) —> .class文件 —> 内存中的字节码。

Spring AOP切面方法的执行顺序

这里简单介绍一下,切面的执行方法和其执行顺序:

  • @Around 通知方法将目标方法封装起来
  • @Before 通知方法会在目标方法调用之前执行
  • @After 通知方法会在目标方法返回或者异常后执行
  • @AfterReturning 通知方法会在目标方法返回时执行
  • @Afterthrowing 通知方法会在目标方法抛出异常时执行

这里以一个返回正常的情况为例:(异常替换最后一步即可)

SpringBoot通过自定义注解实现日志打印的示例代码

ControllerMethodLogAspect.class:用于打印日志的切面定义类

注意要在启动类扫描这个class,并且添加 @EnableAspectJAutoProxy(proxyTargetClass = true)

@Slf4j
@Component
@Aspect
public class ControllerMethodLogAspect {

  @Pointcut("@annotation(com.xiyuan.demo.annotation.ControllerMethodLog)")
  public void pointCut() {
  }

  /**
   * 在切点运行前执行该方法
   */
  @Before("pointCut()")
  public void doBefore(JoinPoint joinPoint) {
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    Method method = signature.getMethod();
    ControllerMethodLog annotation = method.getAnnotation(ControllerMethodLog.class);
    if (Objects.isNull(annotation)) {
      return;
    }
    String methodName = method.getDeclaringClass().getSimpleName() + "." + method.getName();
    log.info("start {}:入参:{}", methodName, JSON.toJSONString(joinPoint.getArgs()));
  }


  /**
   * 在切点运行后,无异常时执行该方法
   *
   * @param joinPoint
   * @param result
   */
  @AfterReturning(value = "pointCut()", returning = "result")
  public void afterReturn(JoinPoint joinPoint, Object result) {
    MethodSignature signature = (MethodSignature) joinPoint.getSignature();
    Method method = signature.getMethod();
    ControllerMethodLog annotation = method.getAnnotation(ControllerMethodLog.class);
    if (Objects.isNull(annotation)) {
      return;
    }
    String methodName = method.getDeclaringClass().getSimpleName() + "." + method.getName();
    log.info("end {}:响应:{}", methodName, JSON.toJSONString(result));
  }

}

验证

getUserById:根据id获取用户的信息

@GetMapping("/getUserById")
@ApiOperation(value = "根据用户id获取用户")
@ControllerMethodLog
public ResponseResult getUserById(@RequestParam(name = "id", required = true) String id) {
  UserInfoPojo userInfoPojo = userService.getUserById(id);
  return ResponseResult.success(userInfoPojo, ConstantsUtil.QUERY_SUCCESS);
}

Swagger接口信息如下:

SpringBoot通过自定义注解实现日志打印的示例代码

IDEA控制台打印信息如下:

SpringBoot通过自定义注解实现日志打印的示例代码

总结

到此这篇关于SpringBoot通过自定义注解实现日志打印的示例代码的文章就介绍到这了,更多相关SpringBoot自定义注解日志打印内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...