您觉得本文档还缺少什么内容?可以自己补充~
@SysLog 记录操作日志
- 配置文件介绍
bc:
log:
enabled: false # false=禁止记录操作日志 true=开启
type: DB # 日志存储位置 DB=数据库 LOGGER=日志文件
- 注解属性介绍详看@SysLog中的注释! 其中value属性是支持SpEL表达式的.
- 注解使用举例
// 禁用操作日志
@SysLog(enabled = false)
// response = false不记录方法的响应参数
@SysLog(value = "'分页列表查询:第' + #params?.current + '页, 显示' + #params?.size + '行'", response = false)
// requestByError = false 表示, 方法报错时, 也不记录请求参数
@SysLog(value = "'保存订单:订单编码' + #data?.code + ', 订单Id:' + #data?.name", request = false, requestByError = false)
- SysLog 注解参数详解
/**
* 是否启用 操作日志
* 禁用控制优先级:bc.log.enabled = false > 控制器类上@SysLog(enabled = false) > 控制器方法上@SysLog(enabled = false)
*
* @return 是否启用
*/
boolean enabled() default true;
/**
* 操作日志的描述, 支持spring 的 SpEL 表达式。
*
* @return {String}
*/
String value() default "";
/**
* 是否拼接Controller类上@Api注解的描述值
*
* @return 是否拼接Controller类上的描述值
*/
boolean controllerApiValue() default true;
/**
* 是否记录方法的入参
*
* @return 是否记录方法的入参
*/
boolean request() default true;
/**
* 若设置了 request = false、requestByError = true,则方法报错时,依然记录请求的入参
*
* @return 当 request = false时, 方法报错记录请求参数
*/
boolean requestByError() default true;
/**
* 是否记录返回值
*
* @return 是否记录返回值
*/
boolean response() default true;
原理:
通过AOP拦截标记了@SysLog 的方法, 拦截后, SysLogAspect 中的方法用于获取被拦截方法的入参和返回值. 然后发布一个 SysLogEvent 事件 (为了让操作日志尽可能少的影响方法调用时长,采用事件方式来异步处理, 也可以改成消息队列之类的), SysLogListener 监听器接收到事件后, 调用 consumer.accept 方法, 让对操作日志进行存储.