MDC日志追踪

本文介绍了如何在Java中实现日志追踪,包括初级的每层传递参数,中级的ThreadLocal方法,以及框架MDC的使用。讨论了MDC的边界问题,如异步和分布式场景下的挑战及解决方案。提到了通过HTTP请求参数传递traceId,并通过filter进行处理。同时,文章还提及了日志采集服务的相关考虑,提供了pom文件、application.properties、log4j2.xml配置示例以及拦截器的编写思路。
摘要由CSDN通过智能技术生成

日志追踪

1.如何实现 问题 以及解决方案

初级 每层传参下去 从controller -> service -> dao

中级 通过threalocal

什么是threadlocal 为线程创建一个副本 是以线程号为id 的map 可以塞值 塞我们想要的 traceId

框架MDC

MDC(Mapped Diagnostic Context,映射调试上下文)是 log4j 和 logback 提供的一种方便在多线程条件下记录日志的功能。

MDC中的put方法其实就是讲键值对放入一个Hashtable对象中,然后赋值给当前线程的ThreadLocal.ThreadLocalMap对象,即threadLocals,这保证了各个线程的在MDC键值对的独立性。

边界

1.mdc争对的是当前线程 ,所以当你使用异步,或者说new Thread的时候就不支持了

如何解决: 可以在多线程里面从新设置一遍 MDC.put(“traceId”,“业务唯一键”)

2.分布式的时候 当A系统 调用B系统的时候 下游的系统如何获取traceId

如何解决 从A系统到B系统 走的是hettp 协议 所以我们就可以在url上面做文章

hettp://www.bai.A?traceId=唯一键

springcloud里面的sleuth 就是通过这个方法去实现的

我们直接的服务 怎么去实现他呢 编写两个filter 去实现他

转发的时候对url里面设置一个这个的请求参数

消费端那边先去获取这个traceId 再通过mdc put进去 日志打印的格式加上traceID 这个参数

3.日志采集 服务很多 不知你哪一台去获取 elk 后续再涉及

代码实现

pom文件

<!--一定要先把这里面的logging给排除掉-->
<dependency>
    <groupId>org.springframework.boot</group
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值