首页 > 解决方案 > 有没有办法使用 logback 将 gRPC 上下文中的值打印到日志中?

问题描述

我正在使用 gRPC 编写一个新的微服务。传统上,在记录时,我曾经在 logback 的 MDC 中填充跟踪 ID,而 logback 配置直接负责在所有日志语句中打印跟踪 ID。使用 gRPC,我使用 Context 设置跟踪 ID,但无法找到使用 logback 配置文件直接记录它们的方法。

我认为 Context 是从此链接执行此操作的正确位置How to intercept the headers from in call to one service and insert it into another request in gRPC-java?

在下面找到我用来在 java 项目中从 logback 的 MDC 打印值的模式。

<Pattern>%date{dd-MM-yyyy;HH:mm:ss.SSS}|[%mdc{CLIENT-ID}]|[%mdc{REQ-ID}]|[%thread] %-5level %logger{36} - %msg%n
            </Pattern>

有没有办法像上面一样直接将上下文中的值打印到日志语句中?这甚至是在处理 gRPC 时考虑在日志中记录跟踪 id 的正确方法吗

标签: logbackgrpcgrpc-java

解决方案


是的,通过使用上下文,您走在了正确的轨道上。这样做的方法是编写一个自定义布局(子类LayoutBase<ILoggingEvent>),它将查询上下文并将其写入日志。查询上下文的代码是:

Span span = ContextUtils.getValue(Context.current());

然后将其转换为字符串:

span.getContext().getTraceId().toLowerBase16()

推荐阅读