日志追踪
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