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=trueAdd %(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