专栏名称: Java知音
专注于Java,推送技术文章,热门开源项目等。致力打造一个有实用,有情怀的Java技术公众号!
今天看啥  ›  专栏  ›  Java知音

我司使用了两年的高效日志打印工具,非常牛逼!

Java知音  · 公众号  ·  · 2024-09-03 10:05

主要观点总结

本文介绍了如何通过注解和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 ………………………………

原文地址:访问原文地址
快照地址: 访问文章快照
总结与预览地址:访问总结与预览