Class AbstractAuditLogAPMEventListener

java.lang.Object
tech.riemann.nif.apm.event.APMEventListener
tech.riemann.nif.apm.event.AbstractAuditLogAPMEventListener
All Implemented Interfaces:
EventListener, org.springframework.context.ApplicationListener<APMEvent>
Direct Known Subclasses:
AuditLogAPMEventListener

public abstract class AbstractAuditLogAPMEventListener extends APMEventListener
审计日志APM事件监听器抽象类

继承自APMEventListener,提供审计日志的保存功能

主要功能: 1. 将APM日志转换为审计日志(AuditLog) 2. 支持分表存储(通过TableSuffixProvider提供表名后缀) 3. 自动创建分表(如果不存在) 4. 过滤Spring MVC内置对象,避免序列化异常 5. 提供扩展点供子类实现(tagName、operationName、ignore等)

子类需要实现的抽象方法: - createTable(String suffix):创建分表 - saveLog(String suffix, AuditLog log):保存审计日志 - tagName(Class, Method):获取业务模块标签 - operationName(Class, Method):获取业务操作名称 - ignore(APMLog, Class, Method):是否跳过记录审计日志

使用示例:

public class MyAuditLogListener extends AbstractAuditLogAPMEventListener {
        public MyAuditLogListener(Dao dao, String application, TableSuffixProvider provider) {
                super(dao, application, provider);
        }

        @Override
        public void createTable(String suffix) {
                // 创建审计日志表
        }

        @Override
        public void saveLog(String suffix, AuditLog log) {
                // 保存审计日志到数据库
        }

        @Override
        public String tagName(Class<?> clazz, Method method) {
                return "用户管理";
        }

        @Override
        public String operationName(Class<?> clazz, Method method) {
                return "创建用户";
        }

        @Override
        public boolean ignore(APMLog log, Class<?> clazz, Method method) {
                return false; // 不跳过任何日志
        }
}
Author:
Kerbores(kerbores@riemann.tech)
  • Constructor Details

    • AbstractAuditLogAPMEventListener

      public AbstractAuditLogAPMEventListener()
  • Method Details

    • init

      @PostConstruct public void init()
      初始化服务器IP地址

      在Bean初始化时执行,获取本机IP地址

      注意:获取失败会抛出异常,因为IP字段是审计日志的重要标识

    • createTable

      public abstract void createTable(String suffix)
      创建分表

      子类需要实现此方法来创建审计日志分表

      Parameters:
      suffix - 表名后缀
    • saveLog

      public abstract void saveLog(String suffix, AuditLog log)
      保存审计日志

      子类需要实现此方法来保存审计日志到数据库

      Parameters:
      suffix - 表名后缀
      log - 审计日志对象
    • tagName

      public abstract String tagName(@Nullable Class<?> clazz, @Nullable Method method)
      获取业务模块标签

      子类需要实现此方法来定义业务模块标签

      Parameters:
      clazz - 类
      method - 方法
      Returns:
      业务模块标签
    • operationName

      public abstract String operationName(@Nullable Class<?> clazz, @Nullable Method method)
      获取业务操作名称

      子类需要实现此方法来定义业务操作名称

      Parameters:
      clazz - 类
      method - 方法
      Returns:
      业务操作名称
    • ignore

      public abstract boolean ignore(APMLog log, @Nullable Class<?> clazz, @Nullable Method method)
      判断是否跳过记录审计日志

      子类可以重写此方法来决定哪些日志不需要记录

      Parameters:
      log - APM日志对象
      clazz - 类
      method - 方法
      Returns:
      true表示跳过,false表示记录
    • handleAPMLog

      public void handleAPMLog(APMLog log, @Nullable Class<?> clazz, @Nullable Method method)
      Description copied from class: APMEventListener
      处理APM日志(带Class和Method信息)

      默认实现会调用handleAPMLog(APMLog log)方法

      Overrides:
      handleAPMLog in class APMEventListener
      Parameters:
      log - APM日志
      clazz - 被监控的类
      method - 被监控的方法
    • beforeSave

      protected AuditLog beforeSave(AuditLog auditLog)
      审计日志入库前处理钩子(H15)

      重要提示:审计日志包含原始请求参数(args)、请求头(headers)、返回值(returnObj), 其中可能含有密码、Token、Cookie、身份证号、手机号、银行卡等敏感信息,默认会原样落库。

      默认配置下的安全基线:审计监听器默认不注册 (nif.apm.listener.audit.enabled 默认 false),须显式开启后才会采集落库; 因此生产环境默认无敏感数据入库风险。一旦显式开启审计,请务必覆写本方法 对敏感字段做脱敏、裁剪或过滤后再落库(审计表通常权限较低且按月长期留存)。

      示例:

      @Override
      protected AuditLog beforeSave(AuditLog auditLog) {
              // 例如:清空敏感字段,或对值做掩码处理
              auditLog.setArgs(null);
              auditLog.setHeaders(null);
              return auditLog;
      }
      
      Parameters:
      auditLog - 构建完成的审计日志(尚未落库)
      Returns:
      处理后的审计日志(默认原样返回)
    • isSpringMvcBuiltInObject

      public boolean isSpringMvcBuiltInObject(Object obj)
    • toString

      public String toString(Object[] args)
    • toString

      public String toString(Object arg)
    • handleAPMLog

      public void handleAPMLog(APMLog log)
      Description copied from class: APMEventListener
      处理APM日志(抽象方法,子类必须实现)

      子类需要实现此方法来自定义日志处理逻辑

      Specified by:
      handleAPMLog in class APMEventListener
      Parameters:
      log -
      See Also: