乐趣区

关于springboot:如何优雅地记录操作日志

日志对于一个零碎来说不可或缺,对于问题的排查,问题的再现有着至关重要的作用。因为不想从日志文件一行行摸索,想谋求简略、快捷、不便;只需依据条件就能够检索到相应接口日志,以及是否呈现报错的状况。同时我不想用在业务代码中记录业务日志的形式。那还有什么办法呢?思考片刻,想到了用 AOP 的形式去记录接口日志。
于是秉着一劳永逸的思维。我打算将我的项目封装成 starter,在须要用到的中央,间接引入即可失效。无需做更多简单、繁琐、反复的工作。

具体做法分三步走

  1. 定义日志级别枚举,因为不同日志级别,代表着接口办法不同的日志记录形式。包含:NONE 不记录日志,INFO 记录失常日志,ERROR 记录异样日志,ALL 记录全副日志行为。
  2. 定义 AOP 通过 @Logger 注解实现须要加强的切入点,应用 @Around 盘绕加强实现接口办法 入参、出参等信息的填补。
  3. 应用 @PostConstruct 实现 日志表构造 的初始化,使得只须要引入依赖即可主动实现日志的生成与记录。

详细描述

因为在 1 点和 3 点绝对简略,接下来就不再赘述,以下次要针对 2 点 进行详细描述。

  1. 因为波及到注解实现切点,于是我兼容了注解在 类 上 和 办法 上都能够实现操作,留神,此处办法上的注解优先级更高些,这也使得一个类下能够排除某些办法,使得使用更加灵便多变。
  2. 初始化日志实体数据,通过 ProceedingJoinPoint 参数以及 Hutool 工具类实现相干信息的提取。
  3. 通过开启新线程的形式实现日志的长久化,因为不想影响到主业务逻辑的执行。
@Around("@within(com.cpz.log.annotation.Logger) || @annotation(com.cpz.log.annotation.Logger)")
public Object doAround(ProceedingJoinPoint point) throws Throwable

应用成果

  1. 通过 maven 将我的项目打包,并将依赖装置到本地仓库,不便其它我的项目应用,同时为了不便这一流程,实现了将 jar 打包为本地依赖的脚本文件,install.bat
mvn install:install-file -Dfile=../spring-boot-starter-logger/target/spring-boot-starter-logger-1.0.jar -DgroupId=com.cpz -DartifactId=spring-boot-starter-logger -Dversion=1.0 -Dpackaging=jar

2) 引入依赖

<dependency>
    <groupId>com.cpz</groupId>
    <artifactId>spring-boot-starter-logger</artifactId>
    <version>1.0</version>
</dependency>

3) 开启记录接口日志

@Logger(level = LogLevel.ALL)
@GetMapping("/test/query")
public List<User> query(User user) {return userService.list();
}
  1. 调用接口查看数据库日志表信息
(1, '/test/query', 'com.cpz.mybatisplus.controller.LoggerController', 'query', '192.168.42.104', '169.254.180.230', 1, '{\"Accept\":\"*/*\",\"User-Agent\":\"PostmanRuntime/7.30.0\",\"Host\":\"192.168.42.104:8080\",\"Accept-Encoding\":\"gzip, deflate, br\",\"Postman-Token\":\"9c3015be-c5a4-4195-8c76-45a03203e201\",\"Content-Length\":\"40\",\"Content-Type\":\"application/json\"}', '{\"user\":{\"name\":\"zhansan\"}}', '[{\"name\":\" 战三 \",\"id\":1,\"age\":11,\"email\":\"cpzisme@qq.com\"},{\"name\":\" 李四 \",\"id\":2,\"age\":12,\"email\":\"lisi@qq.com\"},{\"name\":\" 王五 \",\"id\":3,\"age\":121,\"email\":\"das@qq.com\"}]', '', 153,'2022-12-31 15:55:47');

能够看到,曾经实现日志记录。

自此,本次日志记录就讲到这里,感激浏览!

因为作者学识无限,文中如有不足之处或有须要改良和优化的中央,不吝赐教。
文章源码

退出移动版