主要观点总结
本文介绍了如何通过注解和SpringAop实现日志自动填充用户id和订单Id的功能,详细描述了实现思路和关键代码解读,并进行了验证使用效果展示。
关键观点总结
关键观点1: 目标
打印日志时,自动填充用户id和订单Id等通参,无需手动指定。
关键观点2: 实现思路
1. 日志模板中声明占位符;2. 业务入口将用户信息放到线程ThreadLocal本地变量中;3. 使用SpringAop + 注解自动将用户信息放到线程上下文;4. 配置日志变量,读取上下文变量;5. 基于MDC将订单和用户信息放到线程的上下文Map。
关键观点3: 关键代码解读
1. 获取UserLog注解;2. 使用PropertyUtils.getProperty获取userId和orderId;3. 使用MDC设置变量和清除变量。
关键观点4: 验证使用效果
通过声明业务Service和测试日志打印,展示日志效果。
关键观点5: 总结
通过UserLog注解+Aop,可以简化业务日志打印,提高生产力。可以扩展能力,例如自动打印出入参日志,自动上报监控打点等。
文章预览
为了更方便地排查问题,电商交易系统的日志中需要记录用户id和订单id等字段。然而,每次打印日志都需要手动设置用户id,这一过程非常繁琐,需要想个办法优化下。 log.warn( "user:{}, orderId:{} 订单提单成功" ,userId, orderId); log.warn( "user:{}, orderId:{} 订单支付成功" ,userId, orderId); log.warn( "user:{}, orderId:{} 订单收到履约请求" ,userId, orderId); log.warn( "user:{}, orderId:{} 订单履约成功" ,userId, orderId); 1. 目标 打印日志时,自动填充用户id和订单Id等通参,无需手动指定 2. 实现思路 日志模板中声明占位符 userId , orderId 在业务入口将 userId 放入到线程 ThreadLocal 本地变量中。 使用 SpringAop + 注解 自动将第二步的用户信息放到线程上下文 3. 配置日志变量,读取上下文变量 %X{} 可以自定义占位符,例如本例中 使用 userId:%X{userId} orderId:%X{orderId} ,定义了 userId 和 ord
………………………………