在 Java 生态中,有多个成熟的开源日志记录框架可实现用户操作的自动记录,这些框架通常基于 AOP、注解或拦截器机制,能在不侵入业务代码的前提下完成日志采集。以下是常用的开源方案及特性对比:

1. Spring Security + Spring Data Envers(权限与审计结合)

核心定位:基于 Spring 生态的审计日志框架,专注于数据变更记录
实现方式:通过注解标记实体类,自动记录数据的创建、修改、删除操作及操作人信息

关键特性

  • 无需编写额外日志逻辑,通过 @CreatedBy@LastModifiedBy 等注解标记实体字段
  • 自动关联当前登录用户(需结合 Spring Security 获取用户上下文)
  • 支持记录数据变更历史(旧值、新值、变更时间)
  • 与 JPA/Hibernate 深度集成,适合 ORM 项目

使用示例

@Entity
@Audited // 开启审计
public class User {
    @Id
    @GeneratedValue
    private Long id;
    
    private String name;
    
    @CreatedBy // 自动记录创建人
    private String createUser;
    
    @LastModifiedBy // 自动记录最后修改人
    private String updateUser;
    
    @CreatedDate // 自动记录创建时间
    private LocalDateTime createTime;
}

适用场景:需要跟踪数据变更历史的业务系统(如订单、用户信息),适合与 Spring 生态结合的项目。

2. Logback + MDC(日志上下文增强)

核心定位:通用日志框架的增强方案,通过 MDC 传递上下文信息实现链路追踪与操作记录
实现方式:在请求入口处将用户信息存入 MDC,日志输出时自动携带这些信息

关键特性

  • 轻量级,无需额外依赖(基于 Logback/Log4j2 等主流日志框架)
  • 可记录用户 ID、请求 ID、IP 等上下文信息,便于日志聚合分析
  • 支持自定义日志格式,灵活输出操作详情
  • 适合分布式系统的日志追踪

使用示例

// 拦截器中设置用户上下文
public class LogInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        // 从请求中获取用户信息(实际项目结合权限框架)
        String userId = request.getHeader("X-User-Id");
        MDC.put("userId", userId); // 存入MDC
        MDC.put("ip", request.getRemoteAddr());
        return true;
    }

    @Override
    public void afterCompletion(...) {
        MDC.clear(); // 清除上下文
    }
}

// Logback配置文件中输出MDC信息
<pattern>%d{HH:mm:ss} [%thread] %-5level %logger{36} - userId=%X{userId}, ip=%X{ip} - %msg%n</pattern>

适用场景:需要在通用日志中嵌入用户操作信息的场景,适合所有 Java 项目,尤其适合微服务架构。

3. MyBatis-Plus 审计插件(数据层日志)

核心定位:基于 MyBatis 的数据操作日志插件,专注于数据库 CRUD 操作记录
实现方式:拦截 MyBatis 的 SQL 执行过程,自动记录操作类型、参数、影响行数等

关键特性

  • 零代码侵入,通过配置即可开启数据操作日志
  • 支持记录 SQL 类型(INSERT/UPDATE/DELETE)、参数值、执行耗时
  • 可关联用户信息(需自定义用户上下文获取逻辑)
  • 适合 MyBatis 项目的数据变更审计

使用示例

// 配置审计插件
@Configuration
public class MyBatisConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加审计插件
        interceptor.addInnerInterceptor(new DataChangeRecorderInterceptor());
        return interceptor;
    }
}

适用场景:使用 MyBatis/MyBatis-Plus 的项目,需要记录数据库层面操作日志的场景。

4. Sa-Token + 自定义日志组件(权限框架集成)

核心定位:结合权限框架的用户操作日志方案,适合需要强权限关联的系统
实现方式:基于 Sa-Token 的登录上下文,通过 AOP 拦截接口调用记录操作

关键特性

  • 天然集成用户身份信息(无需手动传递用户 ID)
  • 支持注解式日志标记(如 @OperLog(module = "用户管理", action = "新增")
  • 可扩展日志存储方式(数据库、Elasticsearch 等)
  • 适合管理后台、OA 系统等需要精细权限控制的场景

使用示例

// 自定义日志注解
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface OperLog {
    String module();
    String action();
}

// AOP切面实现日志记录
@Aspect
@Component
public class OperLogAspect {
    @Around("@annotation(operLog)")
    public Object around(ProceedingJoinPoint joinPoint, OperLog operLog) throws Throwable {
        // 从Sa-Token获取当前用户
        String userId = StpUtil.getLoginIdAsString();
        // 记录操作信息(模块、动作、参数等)
        saveLog(userId, operLog.module(), operLog.action(), joinPoint.getArgs());
        return joinPoint.proceed();
    }
}

适用场景:使用 Sa-Token 作为权限框架的项目,需快速集成语义化操作日志。

5. Apache Shiro + 审计日志扩展(传统权限框架)

核心定位:基于 Shiro 权限框架的操作日志方案,适合传统 Java Web 项目
实现方式:通过 Shiro 的拦截器机制,在权限校验过程中记录用户操作

关键特性

  • 与 Shiro 的权限控制无缝结合,可基于角色/权限过滤日志记录
  • 支持自定义日志内容(如操作结果、耗时)
  • 成熟稳定,适合中大型企业级应用

适用场景:使用 Shiro 作为权限框架的传统项目,需要将日志记录与权限控制结合的场景。

框架选择建议

场景需求 推荐框架 核心优势
数据变更审计(ORM 项目) Spring Data Envers 自动记录实体变更历史,与 JPA 深度集成
通用日志增强(全场景) Logback + MDC 轻量灵活,适配所有项目,支持分布式追踪
MyBatis 项目数据操作日志 MyBatis-Plus 审计插件 零代码侵入,专注数据库操作记录
管理后台操作日志(权限强相关) Sa-Token + 自定义 AOP 快速集成,语义化日志,适合权限密集型系统
传统项目(Shiro 生态) Apache Shiro + 审计扩展 稳定可靠,与权限控制深度结合

这些框架均可通过扩展实现用户操作的自动记录,实际项目中可根据技术栈(如 ORM 框架、权限框架)和日志需求(数据变更/接口调用/通用日志)选择最合适的方案。对于复杂场景,也可组合使用(如 MDC 记录上下文 + AOP 记录业务操作)。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐