业务日志注入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依赖
<dependencies>
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-log4j-appender-2.17</artifactId>
<version>OPENTELEMETRY_VERSION</version>
</dependency>
</dependencies>
步骤2 修改log4j2.xml 配置,在pattern中添加%X{trace_id} 与%X{span_id},可以将TraceId与SpanId自动写入日志。
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout
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"/>
</Console>
<OpenTelemetry name="OpenTelemetryAppender"/>
</Appenders>
<Loggers>
<Root level="All">
<AppenderRef ref="OpenTelemetryAppender"/>
<AppenderRef ref="Console"/>
</Root>
</Loggers>
</Configuration>
Logback
步骤1 在pom.xml中添加OpenTelemetry Logback依赖
<dependencies>
<dependency>
<groupId>io.opentelemetry.instrumentation</groupId>
<artifactId>opentelemetry-logback-mdc-1.0</artifactId>
<version>OPENTELEMETRY_VERSION</version>
</dependency>
</dependencies>
步骤2 修改logback.xml配置,在pattern中添加%X{trace_id} 与%X{span_id},可以将TraceId与SpanId自动写入日志。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender name="OpenTelemetry"
class="io.opentelemetry.instrumentation.logback.appender.v1_0.OpenTelemetryAppender">
</appender>
<root level="INFO">
<appender-ref ref="console"/>
<appender-ref ref="OpenTelemetry"/>
</root>
</configuration>
Go语言
OpenTelemetry Go不支持自动注入,需要在记录日志时手动注入TraceId和SpanId。
logrus
import (
oteltrace "go.opentelemetry.io/otel/trace"
"github.com/sirupsen/logrus"
)
func LogrusFields(span oteltrace.Span) logrus.Fields {
return logrus.Fields{
"trace_id": span.SpanContext().TraceID().String(),
"span_id": span.SpanContext().SpanID().String(),
}
}
创建一个Span后,即可记录带有TraceId和SpanId的日志
...
_, span := tracer.Start(ctx, "spanName")
defer span.End()
logEntry := logrus.WithFields(LogrusFields(span))
logEntry.Info("This is an info message with trace and span ID")
...
Python语言
只需要将OTEL_PYTHON_LOG_CORRELATION环境变量打开,即可自动将TraceId与SpanId添加到日志条目中。
export OTEL_PYTHON_LOG_CORRELATION=true
在日志格式中添加%(otelTraceID)s和%(otelSpanID)s,OpenTelemetry会自动将日志中的 %(otelTraceID)s和%(otelSpanID)s替换为TraceId和SpanId。
formatter = logging.Formatter(
'%(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'
)
2024-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