Skip to content

日志模块:基于拦截器(Interceptor)

简介

continew-starter-log-interceptor 是 ContiNew Starter 日志模块基于拦截器(Interceptor)的实现,是针对 Spring Boot Actuator 项目 HttpExchange(原 HttpTrace)的二开增强处理实现。

xml
<dependency>
    <groupId>top.continew</groupId>
    <artifactId>continew-starter-log-interceptor</artifactId>
    <version>最新版本</verison>
</dependency>

主要特性

  • 支持配置记录的 HTTP 请求日志内容(请求头、请求体、请求参数、IP 归属地、浏览器、操作系统、响应头、响应体、响应参数)
  • 支持启用控制台 HTTP 日志输出,不记录日志的接口也支持开启打印访问日志(类似于 Nginx access log)
  • 支持配置放行路由,不进行日志拦截
  • 支持将日志数据保存到任何数据源
  • 辅助 Spring Doc 可以实现操作日志记录

配置示例

详情请查看:top.continew.starter.log.model.LogProperties 配置类。

yaml
--- ### 日志配置
continew-starter:
  log:
    enabled: true
    # 包含信息(默认记录请求头、请求参数、响应头、响应参数)
    includes:
      - DESCRIPTION
      - MODULE
      - REQUEST_HEADERS
      - REQUEST_BODY
      - IP_ADDRESS
      - BROWSER
      - OS
      - RESPONSE_HEADERS
      - RESPONSE_BODY
    # 访问日志配置
    access-log:
      enabled: true
      # 是否打印请求参数(body/query/form)
      print-request-param: true
      # 是否自动截断超长参数值(如 base64、大文本)
      long-param-truncate: true
      # 超长参数检测阈值(单位:字符)
      long-param-threshold: 2000
      # 超长参数最大保留长度(单位:字符)
      long-param-max-length: 50
      # 截断后追加的后缀符号(如配置 "..." 会让截断内容更直观)
      long-param-suffix: ...
      # 是否过滤敏感参数
      param-sensitive: true
      # 敏感参数字段列表(如:password,token,idCard)
      sensitive-params:
        - password
        - oldPassword

除了必然记录的请求方式、请求 URL 等信息外,其他记录信息支持灵活配置组合,默认记录请求头、请求参数、响应头、响应参数。

局部配置

通过 @Log 注解,可以针对单个接口或类进行日志记录,支持灵活配置包含信息、排除信息、是否忽略日志记录。

详情请查看:top.continew.starter.log.annotation.Log 注解。

java
/**
 * 日志注解
 * <p>用于接口方法或类上,辅助 Spring Doc 使用效果最佳</p>
 *
 * @author Charles7c
 * @since 1.1.0
 */
@Documented
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Log {

    /**
     * 日志描述(仅用于接口方法上)
     * <p>
     * 优先级:@Log("描述") > @Operation(summary="描述")
     * </p>
     */
    String value() default "";

    /**
     * 所属模块(用于接口方法或类上)
     * <p>
     * 优先级: 接口方法上的 @Log(module = "模块") > 接口类上的 @Log(module = "模块") > @Tag(name = "模块") 内容
     * </p>
     */
    String module() default "";

    /**
     * 包含信息(在全局配置基础上扩展包含信息)
     */
    Include[] includes() default {};

    /**
     * 排除信息(在全局配置基础上减少包含信息)
     */
    Include[] excludes() default {};

    /**
     * 是否忽略日志记录(用于接口方法或类上)
     */
    boolean ignore() default false;
}

辅助 Spring Doc

辅助 Spring Doc 可以实现操作日志记录功能,简单来说就是通过识别 Spring Doc 注解配置来记录日志的模块、行为信息。当然 @Log 注解配置优先级更高。

配置模块信息:

  • @Tag(name = "部门管理") -> 部门管理
  • @Log(module = "部门管理") -> 部门管理

配置行为信息:

  • @Operation(summary="新增部门") -> 新增部门
  • @Log("新增部门") -> 新增部门

保存日志

通过实现 top.continew.starter.log.dao.LogDao 日志持久层接口,重写 add 方法可以实现保存日志记录到任何指定数据源。

java
@RequiredArgsConstructor
public class LogDaoLocalImpl implements LogDao {

    private final XxxMapper xxxMapper;

    @Override
    public void add(LogRecord logRecord) {
        // 保存日志记录
    }
}

将自行实现的日志持久层 bean 注入到 Spring 容器中。

java
@Configuration
@ConditionalOnEnabledLog
public class LogConfiguration {

    /**
     * 日志持久层接口本地实现类
     */
    @Bean
    public LogDao logDao() {
        return new LogDaoLocalImpl();
    }
}

核心依赖

依赖描述
top.continew:continew-starter-log-core
top.continew:continew-starter-web