百度智能云

All Product Document

          Cloud Monitor

          Business Log Injection Traceid

          This document mainly introduces how to inject TraceID and SpanID into application service logs. Currently, only OpenTelemetry protocol access is supported

          OpenTelementry

          Java language

          The OpenTelemetry Java agent's log injection function supports the following logging frameworks:

          • Log4j2 2.7+
          • Logback 1.0+

          In the log configuration file, TraceID and SpanID are injected using the %X{trace_id} and %X{span_id} fields respectively

          Log4j2

          Step 1

          Add OpenTelemetry Log4j2 dependency directly in pom.xml

          <dependencies>
            <dependency>
              <groupId>io.opentelemetry.instrumentation</groupId>
              <artifactId>opentelemetry-log4j-appender-2.17</artifactId>
              <version>OPENTELEMETRY_VERSION</version>
            </dependency>
          </dependencies>

          Step 2 Modify log4j2.xml configuration by adding %X{trace_id} and %X{span_id} to the pattern to automatically write TraceId and SpanId into logs.

          <?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

          Step 1 Add OpenTelemetry Logback dependency in pom.xml

          <dependencies>
            <dependency>
              <groupId>io.opentelemetry.instrumentation</groupId>
              <artifactId>opentelemetry-logback-mdc-1.0</artifactId>
              <version>OPENTELEMETRY_VERSION</version>
            </dependency>
          </dependencies>

          Step 2 Modify logback.xml configuration by adding %X{trace_id} and %X{span_id} to the pattern to automatically write TraceId and SpanId into logs.

          <?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 language

          OpenTelemetry Go does not support automatic injection; TraceId and SpanId must be manually inserted into logs.

          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(),
              }
          }

          After creating a span, you can log with TraceId and 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 language

          To automatically include TraceId and SpanId in log entries, simply enable the environment variable OTEL_PYTHON_LOG_CORRELATION.

          export OTEL_PYTHON_LOG_CORRELATION=true

          Add %(otelTraceID)s and %(otelSpanID)s to your log format. OpenTelemetry will automatically replace these placeholders with TraceId and SpanId in the logs.

          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
          Previous
          Application Performance Monitor
          Next
          Call chain analysis