发现旧代码中,创建异步任务手动传递traceID,代码臃肿,容易出错。如何优化呢?

大概思路是这样的 ,使用阿里的TransmittableThreadLocal 扩展log4j的ThreadContextMap。话不多说,直接上干货!

  1. 实现如下
public class TtlThreadContextMap implements ThreadContextMap {private final ThreadLocal<Map<String, String>> localMap;public TtlThreadContextMap() {this.localMap = new TransmittableThreadLocal<Map<String, String>>();}@Overridepublic void put(final String key, final String value) {Map<String, String> map = localMap.get();map = map == null ? new HashMap<String, String>() : new HashMap<String, String>(map);map.put(key, value);localMap.set(Collections.unmodifiableMap(map));}@Overridepublic String get(final String key) {final Map<String, String> map = localMap.get();return map == null ? null : map.get(key);}@Overridepublic void remove(final String key) {final Map<String, String> map = localMap.get();if (map != null) {final Map<String, String> copy = new HashMap<String, String>(map);copy.remove(key);localMap.set(Collections.unmodifiableMap(copy));}}@Overridepublic void clear() {localMap.remove();}@Overridepublic boolean containsKey(final String key) {final Map<String, String> map = localMap.get();return map != null && map.containsKey(key);}@Overridepublic Map<String, String> getCopy() {final Map<String, String> map = localMap.get();return map == null ? new HashMap<String, String>() : new HashMap<String, String>(map);}@Overridepublic Map<String, String> getImmutableMapOrNull() {return localMap.get();}@Overridepublic boolean isEmpty() {final Map<String, String> map = localMap.get();return map == null || map.size() == 0;}@Overridepublic String toString() {final Map<String, String> map = localMap.get();return map == null ? "{}" : map.toString();}@Overridepublic int hashCode() {final int prime = 31;int result = 1;final Map<String, String> map = this.localMap.get();result = prime * result + ((map == null) ? 0 : map.hashCode());return result;}@Overridepublic boolean equals(final Object obj) {if (this == obj) {return true;}if (obj == null) {return false;}if (!(obj instanceof TtlThreadContextMap)) {return false;}final TtlThreadContextMap other = (TtlThreadContextMap) obj;final Map<String, String> map = this.localMap.get();final Map<String, String> otherMap = other.getImmutableMapOrNull();if (map == null) {if (otherMap != null) {return false;}} else if (!map.equals(otherMap)) {return false;}return true;}
}
  1. 在项目resources下,新建log4j2.component.properties文件,内容如下
log4j2.threadContextMap=com.xxx.xxx.xxxTtlThreadContextMap

感谢您的耐心阅读,希望对您有所帮助,点赞是一种美德,祝您工作顺利 步步高升!

Log4j2跨线程打印traceId相关推荐

  1. Logback日志跨线程追踪实践

    Logback日志跨线程追踪实践 当我们程序在服务器上面跑的时候,是不是很多时候很难定位问题? 当一大堆繁杂的日志文件丢给你的时候,你如何能从中定位到问题? 本项目源码已经上传Github: gith ...

  2. C# 学习笔记(8) 控件的跨线程访问

    C# 学习笔记(8) 控件的跨线程访问 本文参考博客 C#多线程 https://www.cnblogs.com/dotnet261010/p/6159984.html C# 线程与进程 https: ...

  3. c#基础,单线程,跨线程访问和线程带参数

    1 using System; 2 using System.Collections.Generic; 3 using System.Threading; 4 using System.Windows ...

  4. SkyWalking8.4监控跨线程问题解决

    SkyWalking8.x监控异步跨线程问题 一. 异步多线程问题 添加依赖 开启异步多线程 测试类方法 Controller层处理 分析 二. 指定跟踪上下文的K-V 制作不易,求一个点赞+关注~~ ...

  5. slf4j 怎么配置日志分析打印 traceID

    slf4j 打印traceID介绍 slf4j除了trace.debug.info.warn.error这几个日志接口外,还可以配合日志分析将数据写入日志. 在使用日志接口时我们一般这么做 Logge ...

  6. ZeroMq实现跨线程通信

    ZeroMq实现跨线程通信 之前在技术崇拜的技术经理指导下阅读了ZeroMq的基础代码,现在就将阅读的心得与成果记录一下,并重新模仿实现了一下经理的异步队列. 1.对外接口 //主要接口(1)void ...

  7. c#中如何跨线程调用windows窗体控件?

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...

  8. js 原生跨页面通信_DOM操作是跨线程的你知道吗?

    在JS世界里面浏览器有两个重要的功能,分为渲染引擎和JS引擎.渲染引擎专门负责渲染Html和css的,JS引擎是专门用来执行JS的.这两个引擎是在不同的线程里面,它们都自己做着自己的事情,互不打扰. ...

  9. C# 跨线程赋值的简单做法

    通常,C#是不许跨线程赋值的,如:Form1中有个textbox, 若开辟一个新的线程来给 这个textbox赋值时,会出现异常. MSDN中提出了具体的做法,较为繁琐,就不说了. 我这里有个简单办法 ...

最新文章

  1. DOM解析和SAX解析的区别
  2. exe4j打包exe_Java日常实用技巧之程序打包为可执行文件
  3. Vue的表单组件之复选框
  4. 奥鹏2014计算机应用基础,奥鹏大连理工大学2014年春《计算机应用基础》在线测试...
  5. 阿里巴巴AI夺肝结节诊断两项世界冠军,至今无人超越
  6. Windows下Nginx的启动、停止等基本命令
  7. 北京创客空间_世界上最大的创客空间,可增强开放安全性等
  8. centos上安装updatedb,command not found
  9. 脚本文档_创建完美的架构文档脚本
  10. elmentui的短信验证界面_[javascript] elementui下login登录页界面和js验证逻辑
  11. DHCP服务原理(转载)
  12. 企业网络规划和设计方案(一)
  13. 基于Python的指数基金量化投资 - 指数的净资产收益率计算
  14. flutter 学习之项目一
  15. JCameraView 仿微信拍照Android控件(点击拍照,长按录小视频)
  16. Windows上架设Turn服务器
  17. linux 系统命令被后门修改_Linux、Windows权限维持常用后门学习总结
  18. 计算机学科教育案例怎么写,关于举办2019年学院《计算机应用基础》课程教学改革实验案例征文比赛的通知...
  19. 机器人技术-机器人避障研究现状
  20. 什么是订货系统?订货系统怎么选?哪个好用

热门文章

  1. 格局打开,外贸牛人的价格谈判策略!
  2. 利用虚拟机virtualbox配置智汀家庭云,让米家设备连接Homekit
  3. 能考上重本的学生成绩处于什么水平?看完这篇就懂了
  4. Android Tethering
  5. 微信小程序github源码大全下载
  6. 极光推送上线7周年大庆,777件礼物送给大家
  7. 流程图软件最新排名,一分钟了解画流程图用什么软件
  8. SIW 2021 v11.6.0824 电脑信息综合检测工具技术员单文件版
  9. 最重要的两种思维:逻辑思维与结构化思维
  10. 计算广告4——用户增长