Annotation Type OperationLog


@Target(METHOD) @Retention(RUNTIME) @Documented @Inherited public @interface 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
    Modifier and Type
    Class
    Description
    static interface 
    一些通用的操作,用于填充 Operation
  • Required Element Summary

    Required Elements
    Modifier and Type
    Required Element
    Description
    操作动作标识 【必填】, 如登录、登出、查询、新增、修改、删除、上传、下载等操作。 操作动作标识的多语言词条在多语言翻译文件中提供。
  • Optional Element Summary

    Optional Elements
    Modifier and Type
    Optional Element
    Description
    操作内容 (选填) 该字段仅适用于不支持多语言的情况 【支持多语言时,请在代码中编码填充 detailItems OperationLogDTO.addDetailItem(java.lang.String) 】
    操作详情多语言 key (选填)
    boolean
    在创建子线程 / 提交线程池时,将日志上下文拷贝到新的线程中,默认不传播 传播后,若当前线程不需要记录日志(因为被操作对象信息可能不完整),需要
    invalid @link
    {@link OpLogContext#setAutoLog)
    } false
    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
      操作内容 (选填) 该字段仅适用于不支持多语言的情况 【支持多语言时,请在代码中编码填充 detailItems OperationLogDTO.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

      日志上下文传播 / 创建策略:当在加了该注解的方法 A 中调用 加了该注解的方法 B 时,如何引导框架记录希望的操作记录 默认,如果不存在嵌套调用,则新建一个上下文。若执行该方法时已经存在日志上下文,则不记录该方法的日志。 参考了 Spring Data 的事务传播
      Default:
      USE_DEFAULT
    • enableCrossThread

      boolean enableCrossThread
      在创建子线程 / 提交线程池时,将日志上下文拷贝到新的线程中,默认不传播 传播后,若当前线程不需要记录日志(因为被操作对象信息可能不完整),需要
      invalid @link
      {@link OpLogContext#setAutoLog)
      } false
      Default:
      false