微服务分布式架构中,如何实现日志链路跟踪
摘要:接口设计出来返回结果值和编码,还有哪些是需要我们优化的结果参数?微服务分布式架构中,如何实现日志链路跟踪?
本文分享自华为云社区《微服务分布式架构中,如何实现日志链路跟踪?》,作者:码农架构。
Logback 背景
Logback 是由 log4j 创始人设计的另一个开源日志组件,官方网站: http://logback.qos.ch。它当前分为下面下个模块:
logback-core:其它两个模块的基础模块
logback-classic:它是 log4j 的一个改良版本,同时它完整实现了 slf4j API 使你可以很方便地更换成其它日志系统如 log4j 或 JDK14 Logging
logback-access:访问模块与 Servlet 容器集成提供通过 Http 来访问日志的功能
普通 debug 日志
SQL 执行日志
Logback 配置案例
日志级别排序为: TRACE < DEBUG < INFO < WARN < ERROR
%d:表示日期
%n:换行
%thread:表示线程名
%level:日志级别
%msg:日志消息
%file:表示文件名
%class: 表示文件名
%logger:Java 类名(含包名,这里设定了 36 位,若超过 36 位,包名会精简为类似 a.b.c.JavaBean)
%line:Java 类的行号
注意:
在 logback 中,%relative 表示自应用程序启动以来打印相对时间戳(以毫秒为单位). %-4 只是元素的对齐方式.
案例
由于案例中是守护线程 thread-monitor-daemon,所以不记录链路 ID。对在系统设计的时候对于线程的命名规范也是有约束的
这里就不做详细展开后续有机会会分享。
回归正题比如下面的例子中记录了请求的链路 ID
对于上图中显示的系统启动时间、当前时间、当前线程、对应路径按照 logback 官方配置就可以逐步完善对于的日志信息,但是对于链路 ID 的生成写入就需要特殊处理。
链路 ID 设计
对于链路追踪设计我个人比较喜欢两种方案
第一种
在每一次请求中链路编号(traceId)、单元编号(spanId)都是通过 HttpHeader 的方式进行传递,日志的起始位置会主动生成 traceId、spanId,而起始位置的 Parent SpanId 则是不存在的,值为 null。
这样每次通过 restTemplate、Openfeign 的形式访问其他服务的接口时,就会携带起始位置生成的 traceId、spanId 到下一个服务单元。
第二种
在每一次请求中链路编号(traceId),没经过一次微服务对于深度(Deep)加 1
请求拦截
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/a876056363d886a741e7c01e6】。文章转载请联系作者。
评论