如何使用OpenTelemetry将Trace ID自动写入日志
Trace ID写入日志后,可以将链路追踪与日志数据关联起来,实现高效的性能分析以及故障诊断。本章节介绍如何使用OpenTelemetry将Trace ID自动写入日志。
Java
- 使用Log4j2
- 在pom.xml中添加OpenTelemetry Log4j2依赖,请将OPENTELEMETRY_VERSION替换为最新版本。示例如下:
<artifactId>opentelemetry-log4j-context-data-2.17-autoconfigure</artifactId>
- 修改log4j2.xml配置,在pattern中添加%X{trace_id} ,可以将Trace ID自动写入日志。
pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} trace_id=%X{trace_id} trace_flags=%X{trace_flags} - %msg%n"
- 在pom.xml中添加OpenTelemetry Log4j2依赖,请将OPENTELEMETRY_VERSION替换为最新版本。示例如下:
- 使用Logback
- 在pom.xml中添加OpenTelemetry Logback依赖。请将OPENTELEMETRY_VERSION替换为最新版本。
- 使用Logback(SpringBoot项目)
Spring Boot项目已经内置了日志框架,默认使用Logback实现日志相关功能。因此,只需增加少量配置即可实现Trace ID写入日志。
在application.properties中设置logging.pattern.level,添加%mdc{trace_id}与%mdc{span_id}到日志中。示例如下:
logging.pattern.level=trace_id=%mdc{trace_id} %5p
GO
OpenTelemetry Go需要在记录日志时手动添加Trace ID。
- 引入依赖。
import ( oteltrace "go.opentelemetry.io/otel/trace" "github.com/sirupsen/logrus" )
- 创建工具函数,从Span中提取Trace ID,并添加到Logrus日志字段。
func LogrusFields(span oteltrace.Span) logrus.Fields { return logrus.Fields{ "trace_id": span.SpanContext().TraceID().String(), } }
- 创建一个Span后,即可记录带有Trace ID的日志。
... defer span.End() logEntry := logrus.WithFields(LogrusFields(span)) logEntry.Info("This is an info message with trace ID") ...
Python
OpenTelemetry Python支持自动将Trace ID写入日志中。如需要获取更多信息,请参见 OpenTelemetry 日志的简介。
- 设置环境变量OTEL_PYTHON_LOG_CORRELATION为true,开启自动将Trace ID添加到日志条目中的能力。
export OTEL_PYTHON_LOG_CORRELATION=true
- 在日志格式中添加%(otelTraceID)s,OpenTelemetry会自动将日志中的 %(otelTraceID)s替换为Trace ID。logging.Formatter示例如下:
formatter = logging.Formatter( '%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s resource.service.name=%(otelServiceName)s] - %(message)s')