业务日志注入Traceid
更新时间:2025-04-17
本文主要介绍如何在应用业务日志中注入 TraceID 和 SpanID,目前只支持OpenTelementry协议接入
OpenTelementry
java语言
OpenTelementry Java 探针的日志注入功能支持如下日志框架:
- Log4j2 2.7+
- Logback 1.0+
在日志配置文件中,TraceID 和 SpanID 分别使用 %X{trace_id}和 %X{span_id}字段注入
Log4j2
步骤1
直接在pom.xml中添加OpenTelemetry Log4j2依赖
Plain Text
1<dependencies>
2 <dependency>
3 <groupId>io.opentelemetry.instrumentation</groupId>
4 <artifactId>opentelemetry-log4j-appender-2.17</artifactId>
5 <version>OPENTELEMETRY_VERSION</version>
6 </dependency>
7</dependencies>
步骤2 修改log4j2.xml 配置,在pattern中添加%X{trace_id} 与%X{span_id},可以将TraceId与SpanId自动写入日志。
Plain Text
1<?xml version="1.0" encoding="UTF-8"?>
2<Configuration status="WARN">
3 <Appenders>
4 <Console name="Console" target="SYSTEM_OUT">
5 <PatternLayout
6 pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} trace_id: %X{trace_id} span_id: %X{span_id} trace_flags: %X{trace_flags} - %msg%n"/>
7 </Console>
8 <OpenTelemetry name="OpenTelemetryAppender"/>
9 </Appenders>
10 <Loggers>
11 <Root level="All">
12 <AppenderRef ref="OpenTelemetryAppender"/>
13 <AppenderRef ref="Console"/>
14 </Root>
15 </Loggers>
16</Configuration>
Logback
步骤1 在pom.xml中添加OpenTelemetry Logback依赖
Plain Text
1<dependencies>
2 <dependency>
3 <groupId>io.opentelemetry.instrumentation</groupId>
4 <artifactId>opentelemetry-logback-mdc-1.0</artifactId>
5 <version>OPENTELEMETRY_VERSION</version>
6 </dependency>
7</dependencies>
步骤2 修改logback.xml配置,在pattern中添加%X{trace_id} 与%X{span_id},可以将TraceId与SpanId自动写入日志。
Plain Text
1<?xml version="1.0" encoding="UTF-8"?>
2<configuration>
3
4 <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
5 <encoder>
6 <pattern>
7 %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
8 </pattern>
9 </encoder>
10 </appender>
11 <appender name="OpenTelemetry"
12 class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
13 </appender>
14
15 <root level="INFO">
16 <appender-ref ref="console"/>
17 <appender-ref ref="OpenTelemetry"/>
18 </root>
19
20</configuration>
Go语言
OpenTelemetry Go不支持自动注入,需要在记录日志时手动注入TraceId和SpanId。
logrus
Plain Text
1import (
2 oteltrace "go.opentelemetry.io/otel/trace"
3 "github.com/sirupsen/logrus"
4)
5
6func LogrusFields(span oteltrace.Span) logrus.Fields {
7 return logrus.Fields{
8 "trace_id": span.SpanContext().TraceID().String(),
9 "span_id": span.SpanContext().SpanID().String(),
10 }
11}
创建一个Span后,即可记录带有TraceId和SpanId的日志
Plain Text
1...
2_, span := tracer.Start(ctx, "spanName")
3defer span.End()
4logEntry := logrus.WithFields(LogrusFields(span))
5logEntry.Info("This is an info message with trace and span ID")
6...
Python语言
只需要将OTEL_PYTHON_LOG_CORRELATION环境变量打开,即可自动将TraceId与SpanId添加到日志条目中。
Plain Text
1export OTEL_PYTHON_LOG_CORRELATION=true
在日志格式中添加%(otelTraceID)s和%(otelSpanID)s,OpenTelemetry会自动将日志中的 %(otelTraceID)s和%(otelSpanID)s替换为TraceId和SpanId。
Plain Text
1formatter = logging.Formatter(
2 '%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s resource.service.name=%(otelServiceName)s] - %(message)s'
3)
4
52024-06-25 10:00:55,494 INFO [app] [app.py:80] [trace_id=70561de6a164ac991bfff2281b7f**** span_id=4b7f3c798460**** resource.service.name=ot-python-demo] - hello world