深入解析mzt-biz-log:SpringBoot操作日志组件实战指南
一、组件概述
mzt-biz-log是一款专为SpringBoot设计的操作日志记录组件,它通过注解方式优雅地解决了业务系统中常见的操作日志记录问题。该组件的核心价值在于能够清晰地记录"谁在什么时间对什么做了什么"这一关键业务信息。
二、核心功能特性
- 基础日志记录:自动记录操作人、操作时间和操作内容
- SpEL表达式支持:支持在日志模板中使用强大的SpEL表达式
- 自定义函数:允许开发者扩展日志内容的生成逻辑
- 对象差异对比:自动比较对象修改前后的差异
- 条件日志:支持根据条件决定是否记录日志
- 分类记录:可按业务类型对日志进行分类
- 异常处理:自动区分成功和失败的操作日志
三、快速入门
3.1 环境准备
首先需要在项目中添加组件依赖:
<dependency>
<groupId>io.github.mouzt</groupId>
<artifactId>bizlog-sdk</artifactId>
<version>1.1.1</version>
</dependency>
3.2 启用组件
在SpringBoot启动类上添加注解开启功能:
@SpringBootApplication
@EnableLogRecord(tenant = "com.yourcompany")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
3.3 基本使用示例
@LogRecordAnnotation(
success = "用户{{#user.name}}创建了订单,订单号:{{#orderNo}}",
prefix = "ORDER",
bizNo = "{{#orderNo}}"
)
public String createOrder(String orderNo, User user) {
// 业务逻辑处理
return "success";
}
四、高级功能详解
4.1 自定义操作人获取
实现IOperatorGetService接口自定义操作人获取逻辑:
@Service
public class CustomOperatorService implements IOperatorGetService {
@Override
public OperatorDO getUser() {
// 从安全上下文中获取当前用户
User currentUser = SecurityContext.getCurrentUser();
return new OperatorDO(currentUser.getId(), currentUser.getName());
}
}
4.2 自定义函数扩展
通过实现IParseFunction接口扩展自定义函数:
@Component
public class ProductParseFunction implements IParseFunction {
@Override
public String functionName() {
return "PRODUCT";
}
@Override
public String apply(Object value) {
// 根据商品ID查询商品信息
Product product = productService.getById(value.toString());
return product != null ? product.getName() + "(" + value + ")" : value.toString();
}
}
使用示例:
@LogRecordAnnotation(
success = "修改了商品{PRODUCT{#productId}}的信息",
prefix = "PRODUCT"
)
public void updateProduct(Long productId) {
// 业务逻辑
}
4.3 对象差异对比
对于需要记录对象变更的场景,可以使用DIFF功能:
- 首先在实体类上添加注解:
@Data
public class User {
@DiffLogField(name = "用户名")
private String username;
@DiffLogField(name = "角色", function = "ROLE")
private String role;
@DiffLogField(name = "状态")
private Integer status;
}
- 在方法上使用DIFF函数:
@LogRecordAnnotation(
success = "更新了用户信息{_DIFF{#oldUser, #newUser}}",
prefix = "USER",
bizNo = "{{#newUser.id}}"
)
public void updateUser(User oldUser, User newUser) {
// 更新逻辑
}
4.4 条件日志记录
通过condition属性控制日志记录条件:
@LogRecordAnnotation(
success = "更新了配置项{{#configKey}}",
prefix = "CONFIG",
condition = "{{#isImportant}}"
)
public void updateConfig(String configKey, boolean isImportant) {
// 配置更新逻辑
}
五、最佳实践建议
- 日志分类设计:根据业务模块设计合理的日志分类前缀
- 敏感信息处理:避免在日志中直接记录敏感信息
- 性能考虑:对于高频操作,评估日志记录对性能的影响
- 存储策略:根据日志量选择合适的存储方案
- 模板设计:保持日志模板简洁明了,便于后续查询分析
六、常见问题解决方案
- SpEL表达式不生效:检查表达式语法是否正确,变量是否可访问
- 自定义函数未执行:确保函数类已被Spring管理
- DIFF功能结果不符合预期:检查对象是否实现了正确的equals方法
- 操作人获取失败:验证IOperatorGetService实现是否正确
- 事务环境下日志记录问题:确保日志记录操作在独立事务中执行
七、组件原理浅析
mzt-biz-log基于Spring AOP实现,主要工作流程如下:
- 通过注解标记需要记录日志的方法
- 方法执行前后,AOP拦截器收集上下文信息
- 解析SpEL表达式和自定义函数
- 构建完整的日志内容
- 通过ILogRecordService实现持久化
对于DIFF功能,组件会通过反射获取标记了@DiffLogField的字段,并比较新旧对象的差异,最终生成易于理解的变更描述。
通过合理使用mzt-biz-log组件,开发者可以大幅减少业务系统中操作日志相关的重复代码,提高开发效率的同时保证日志的一致性和可维护性。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



