Annotation Type OperationLog
创建操作日志注解
将该注解加在业务方法上,可以在被注解的方法执行前创建一个操作日志对象,在该方法、调用方法、以及他们创建的线程中使用用
OpLogContextHolder修改日志。并在该方法执行结束自动记录日志
该注解中的值后续可以修改
无法使用注解时,可以使用 OperationLogFactory.create(java.lang.String)
【操作日志框架原理: Spring AOP(spring boot 1.4之后 Spring AOP 的默认实现为 cglib)】
日志框架局限性(即 spring AOP - cglib 的局限性): CgLib原理为创建目标类子类,因此以下两种情况会导致无法进入AOP 1. 无法创建代理:cglib代理的创建要求目标类能访问和继承,目标方法能被子类覆盖和访问【目标类非 final、非 private,目标方法非 final、非 private】 2. 绕过代理机制:若目标方法非直接调用,而是目标类内部调用,则会绕过代理导致AOP失败。【this指针问题】
# 强制走代理方案一,通过 ThreadLocal 获取代理对象 1. 在配置类添加 @EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy=true) 或 application.yml 的 spring.aop.两个值都置为true 2. ((YourService)AopContext.currentProxy()).yourMethod(); # 强制走代理方案二,若bean为 singleton 的则可使用 @Autowired 注入或 applicationContext.getBean()自身类型自动获取代理对象,通过代理对象调用对应方法
- Author:
- lym
-
Nested Class Summary
Nested Classes -
Required Element Summary
Required Elements -
Optional Element Summary
Optional ElementsModifier and TypeOptional ElementDescription操作内容 (选填) 该字段仅适用于不支持多语言的情况 【支持多语言时,请在代码中编码填充 detailItemsOperationLogDTO.addDetailItem(java.lang.String)】操作详情多语言 key (选填)boolean在创建子线程 / 提交线程池时,将日志上下文拷贝到新的线程中,默认不传播 传播后,若当前线程不需要记录日志(因为被操作对象信息可能不完整),需要} falseinvalid @link
{@link OpLogContext#setAutoLog)boolean在该方法以默认方式记录所有参数(默认方式中 param.type = STRING )被操作对象类型 (选填) 【 推荐1:实体、DTO入参、BO 等,实现 Operable,便不必在注解填充该值。 推荐2:在类注解OperationLogConfig上描述该值,便不必在每个方法上填充 】日志上下文传播 / 创建策略:当在加了该注解的方法 A 中调用 加了该注解的方法 B 时,如何引导框架记录希望的操作记录 默认,如果不存在嵌套调用,则新建一个上下文。若执行该方法时已经存在日志上下文,则不记录该方法的日志。 参考了 Spring Data 的事务传播操作者终端类型(选填) 例: TerminalType.BROWSER 【推荐:在类注解OperationLogConfig上描述该值,便不必在每个方法上填充】
-
Element Details
-
operation
String operation操作动作标识 【必填】, 如登录、登出、查询、新增、修改、删除、上传、下载等操作。 操作动作标识的多语言词条在多语言翻译文件中提供。 -
detailKey
String detailKey操作详情多语言 key (选填)- Default:
""
-
detail
String detail操作内容 (选填) 该字段仅适用于不支持多语言的情况 【支持多语言时,请在代码中编码填充 detailItemsOperationLogDTO.addDetailItem(java.lang.String)】填写
detailKey()将忽略该字段,认为支持多语言- Default:
""
-
logAllParams
boolean logAllParams在该方法以默认方式记录所有参数(默认方式中 param.type = STRING )- See Also:
- Default:
false
-
objectType
String objectType被操作对象类型 (选填) 【 推荐1:实体、DTO入参、BO 等,实现 Operable,便不必在注解填充该值。 推荐2:在类注解OperationLogConfig上描述该值,便不必在每个方法上填充 】- Default:
""
-
terminalType
TerminalType terminalType操作者终端类型(选填) 例: TerminalType.BROWSER 【推荐:在类注解OperationLogConfig上描述该值,便不必在每个方法上填充】- Default:
BROWSER
-
strategy
OperationContextStrategyEnum strategy日志上下文传播 / 创建策略:当在加了该注解的方法 A 中调用 加了该注解的方法 B 时,如何引导框架记录希望的操作记录 默认,如果不存在嵌套调用,则新建一个上下文。若执行该方法时已经存在日志上下文,则不记录该方法的日志。 参考了 Spring Data 的事务传播- Default:
USE_DEFAULT
-
enableCrossThread
boolean enableCrossThread在创建子线程 / 提交线程池时,将日志上下文拷贝到新的线程中,默认不传播 传播后,若当前线程不需要记录日志(因为被操作对象信息可能不完整),需要} falseinvalid @link
{@link OpLogContext#setAutoLog)- Default:
false
-