业务日志注入Traceid
所有文档
menu

云监控 BCM

业务日志注入Traceid

产品详情

本文主要介绍如何在应用业务日志中注入 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
上一篇
应用监控
下一篇
全局拓扑