Skip to main content

切面日志组件 (Logging)

API文档​

https://tech.rydeen.com.cn/apidocs/logging/4.6.0/index.html

组件作用​

本组件主要是为了提供统一的访问日志记录,以便于对系统的访问行为进行监控、分析或审计。本组件提供了以非侵入的方式记录访问日志的功能,只需要在项目中引入本组件的依赖,无需在项目中编写额外的代码即可正常使用。日志组件默认将日志信息写入日志文件,如果需要对输出方式、输出内容进行定制,可以通过配置文件进行配置。

组件用法​

引入依赖​

日志组件配置方式如下:

首先在项目所属的Maven模块中引入组件坐标:

<dependency>
<groupId>cn.com.rydeen.component</groupId>
<artifactId>rydeen-component-logging</artifactId>
</dependency>

配置文件​

我们可以对日志组件进行日志内容自定义,输出方式自定义等配置,具体配置如下,一下配置均为组件默认配置,请根据自己需求修改:

platform:
# 组件配置
component:
# 日志配置
logging:
# 是否启用访问切面日志
enable: true
# 切面日志记录方式(可选值:file、redis、kafka)
record-type: file
# 是否启用请求参数体持久化
request-body-persistent: true
# 是否限制请求参数体大小
request-body-size-limit: false
# 请求参数体最大字符长度
request-body-max-length: 200
# 是否启用响应参数体持久化
response-body-persistent: true
# 是否限制响应参数体大小
response-body-size-limit: false
# 响应参数体最大字符长度
response-body-max-length: 200
# 是否启用数据库持久化
db-persistent: true
# 持久化数据库时一次获取的数据量
db-batch-size: 500
# 记录类型为消息队列时,消息队列的 topic 名称
mq-topic-name: access-log-out-0
# 日志保存到redis时临时暂存的路径
cache-access-log-key: platform:access-log
# 启用全局切点,进入Controller的所有请求都会被拦截
enable-global-advice: false

属性解释:

  • enable:是否启用访问切面日志,默认为true,当设置为false时,将全局关闭访问切面日志记录。
  • record-type:切面日志记录方式,可选值为file、redis、kafka,默认为file,表示将日志记录到文件中,当需要和ELK或其它的数据分析工具进行集成时,可以选择redis或kafka。
  • request-body-persistent:是否启用请求参数体持久化,默认为true,当设置为false时,将不记录被访问接口的请求参数体。
  • request-body-size-limit:是否限制请求参数体大小,默认为false,当设置为true时,将根据request-body-max-length限制请求参数体的长度。
  • request-body-max-length:请求参数体最大字符长度,默认为200,当request-body-size-limit为true时,将根据此值限制请求参数体的长度,防止因为参数体过长撑爆日志文件、数据库或其他的中间件。
  • response-body-persistent:是否启用响应参数体持久化,默认为true,当设置为false时,将不记录被访问接口的响应参数体。
  • response-body-size-limit:是否限制响应参数体大小,默认为false,当设置为true时,将根据response-body-max-length限制响应参数体的长度。
  • response-body-max-length:响应参数体最大字符长度,默认为200,当response-body-size-limit为true时,将根据此值限制响应参数体的长度,防止因为参数体过长撑爆日志文件、数据库或其他的中间件。
  • db-persistent:是否启用数据库持久化,默认为true,当设置为false时,将不记录被@AccessLog(persistent = true)注解修饰的方法到数据库。
  • db-batch-size:持久化数据库时一次获取的数据量,默认为500,因为访问可能非常频繁,所以不会将每次访问的数据都直接写入数据库,日志组件会将生成的访问记录先写入当前本地缓存中,然后定时从本地缓存中获取此处指定的条数,批量写入数据库以提高性能和降低数据库压力。
  • mq-topic-name:记录类型为消息队列时,消息队列的 topic 名称,默认为access-log-out-0。
  • cache-access-log-key:日志保存到redis时临时暂存的路径,默认为platform:access-log。
  • enable-global-advice:启用全局切点,进入Controller的所有请求都会被拦截,默认为false,当设置为true时,将拦截所有进入Controller的请求,不需要在Controller中添加@AccessLog注解。

使用切面日志注解​

在需要记录访问日志的方法上添加@AccessLog注解即可,如:

@AccessLog(value = "获取API信息的接口", persistent = true)
@Operation(summary = "获取指定API信息的接口", method = "GET", description = "通过REST接口请求获取指定API信息。")
@GetMapping("/list/{id}")
public ResultVO<ApiInfo> getApi(@Parameter(name = "API信息ID", required = true)@PathVariable Long id) {
ApiInfo uniqueApi = apiService.getUniqueApi(id);
if (Objects.isNull(uniqueApi)) {
return ResultVO.getError("找不到对应的API信息");
}
return ResultVO.getSuccess(uniqueApi);
}

@AccessLog注解的属性解释:

  • value:访问日志的描述信息,用于描述当前方法的作用,在记录的日志中,日志的title就是此处的值,如果不指定则默认为空值,如:获取API信息的接口。
  • persistent:是否持久化到数据库,默认为false,当设置为true时,将记录此方法的访问日志到指定数据库中。

至此,我们已经完成了日志组件的引入和配置,以及使用切面日志注解的方法,接下来我们可以启动项目并访问/list/{id}接口,然后查看日志文件或数据库中是否有对应的访问日志记录。