低侵入日志切面通过@log注解标记+spring aop拦截实现,前置截断参数、后置/异常异步记录,支持运行时开关、正则粒度控制及cglib兼容,业务代码零修改。

设计低侵入的日志切面,核心是让业务代码完全不感知日志逻辑——不改方法签名、不加调用语句、不引入日志相关依赖。关键不在“怎么记”,而在“谁来记、在哪记、何时记”由配置或约定驱动,而非硬编码。
用注解标记 + AOP 统一拦截
定义一个轻量级注解(如 @Log),仅作标记用途,不带任何实现逻辑:
- 注解保留策略设为
@Retention(RetentionPolicy.RUNTIME),确保运行时可读 - 支持可选属性,比如
level()控制日志级别、includeArgs()控制是否打印参数 - 在 service 或 controller 方法上直接使用:
@Log(includeArgs = false),一行搞定 - AOP 切面通过
@Around("@annotation(com.example.Log)")精准捕获,避免全包扫描带来的性能和误拦风险
按执行阶段分层记录,不阻塞主流程
日志动作本身要快,且失败不能影响业务结果:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 前置:只记录方法名、类名、简单参数(字符串化前做长度截断)
- 后置:异步写入日志系统(如 SLF4J + Logback 的 AsyncAppender),不等 IO 返回
- 异常:捕获后统一格式化堆栈(不打印敏感字段),同样走异步通道
- 耗时统计用
System.nanoTime(),避免System.currentTimeMillis()受系统时钟调整干扰
支持运行时开关与粒度控制
真正的低侵入,意味着日志可随时关闭或降级,无需重启应用:
- 切面内部检查全局配置(如 Spring Boot 的
@Value("${log.enabled:true}")) - 允许按包、按类、按方法名正则匹配启用日志,例如:
log.include-pattern=service\..*User.* - 对高频方法(如查询缓存)默认跳过日志,避免日志量爆炸
- 提供 Actuator 端点动态修改日志开关,生产环境可临时开启某类接口的详细日志用于排查
避免 JDK 动态代理限制,兼容无接口类
如果目标类没实现接口,纯 JDK Proxy 失效,需自动降级到 CGLIB:
- Spring AOP 默认已支持 CGLIB 代理,只需确保类不是
final,方法也不是final - 若不用 Spring,可用 Byte Buddy 在启动时增强字节码,绕过接口限制,且不依赖运行时代理机制
- 统一抽象出
LogInterceptor接口,底层可插拔 JDK Proxy / CGLIB / JavaAgent 三种实现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










