全部产品
Search
文档中心

Managed Service for OpenTelemetry:Menulis ID jejak dan ID rentang ke log

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menggunakan OpenTelemetry untuk secara otomatis menulis ID jejak dan ID rentang ke log. Setelah ID jejak dan ID rentang ditulis ke log, Anda dapat mengaitkan data jejak terdistribusi dengan data log untuk diagnosis kesalahan dan analisis kinerja yang lebih efisien.

Java

Kerangka logging yang didukung

Untuk informasi lebih lanjut, lihat Logger MDC Auto-Instrumentation.

Kerangka logging

Versi yang mendukung instrumentasi otomatis

Dependensi yang diperlukan untuk instrumentasi manual

Log4j1

1.2 dan yang lebih baru

Tidak tersedia

Log4j2

2.7 dan yang lebih baru

opentelemetry-log4j-context-data-2.17-autoconfigure

Logback

1.0 dan yang lebih baru

opentelemetry-logback-mdc-1.0

Menggunakan Log4j2

  1. Tambahkan dependensi OpenTelemetry Log4j2 ke file pom.xml.

    Ganti OPENTELEMETRY_VERSION dengan versi terbaru.

    <dependencies>
      <dependency>
        <groupId>io.opentelemetry.instrumentation</groupId>
        <artifactId>opentelemetry-log4j-context-data-2.17-autoconfigure</artifactId>
        <version>OPENTELEMETRY_VERSION</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  2. Buka log4j2.xml, dan tambahkan %X{trace_id} dan %X{span_id} ke pola untuk mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log.

    Contoh berikut menunjukkan format log:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
      <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>
      </Appenders>
      <Loggers>
        <Root>
          <AppenderRef ref="Console" level="All"/>
        </Root>
      </Loggers>
    </Configuration>

Menggunakan Logback

  1. Tambahkan dependensi OpenTelemetry Logback ke file pom.xml.

    Ganti OPENTELEMETRY_VERSION dengan versi terbaru.

    <dependencies>
      <dependency>
        <groupId>io.opentelemetry.instrumentation</groupId>
        <artifactId>opentelemetry-logback-mdc-1.0</artifactId>
        <version>OPENTELEMETRY_VERSION</version>
      </dependency>
    </dependencies>
  2. Buka logback.xml, dan tambahkan %X{trace_id} dan %X{span_id} ke pola untuk mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log.

    Contoh berikut menunjukkan format log:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %msg%n</pattern>
        </encoder>
      </appender>
    
      <!-- Cukup bungkus appender logging Anda, misalnya ConsoleAppender, dengan OpenTelemetryAppender -->
      <appender name="OTEL" class="io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender">
        <appender-ref ref="CONSOLE"/>
      </appender>
    
      <!-- Gunakan appender "OTEL" yang dibungkus alih-alih appender "CONSOLE" asli -->
      <root level="INFO">
        <appender-ref ref="OTEL"/>
      </root>
    
    </configuration>

Menggunakan Logback (Proyek Spring Boot)

Proyek Spring Boot memiliki kerangka logging bawaan, yaitu Logback secara default. Jika Anda sedang mengembangkan proyek Java Spring Boot, Anda dapat mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log dengan konfigurasi sederhana.

Buka file application.properties dan tambahkan application.properties dan %mdc{span_id} ke logging.pattern.level.

logging.pattern.level=trace_id=%mdc{trace_id} span_id=%mdc{span_id} %5p

Contoh berikut menunjukkan beberapa log:

2024-06-26 10:56:31.200 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=1b08f18b8858bb9a  INFO 53724 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Menginisialisasi Spring DispatcherServlet 'dispatcherServlet'
2024-06-26 10:56:31.201 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=1b08f18b8858bb9a  INFO 53724 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Menginisialisasi Servlet 'dispatcherServlet'
2024-06-26 10:56:31.209 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=1b08f18b8858bb9a  INFO 53724 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Inisialisasi selesai dalam 8 ms
2024-06-26 10:56:31.296 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=5743699405074f4e  INFO 53724 --- [nio-8081-exec-1] com.example.httpserver.ot.OTServer       : halo dunia

Go

OpenTelemetry di Go tidak mendukung penulisan otomatis ID jejak dan ID rentang ke log. Jika Anda tidak melakukan operasi pengembangan tambahan seperti yang berikut ini, Anda perlu mencatat ID jejak dan ID rentang secara manual.

Menggunakan logrus

  1. Tambahkan dependensi.

    import (
        oteltrace "go.opentelemetry.io/otel/trace"
        "github.com/sirupsen/logrus"
    )
  2. Buat fungsi utilitas untuk mengekstrak ID jejak dan ID rentang dari rentang dan menambahkannya ke bidang log Logrus.

    func LogrusFields(span oteltrace.Span) logrus.Fields {
        return logrus.Fields{
            "trace_id": span.SpanContext().TraceID().String(),
            "span_id": span.SpanContext().SpanID().String(),
        }
    }
  3. Setelah rentang dibuat, log dengan ID jejak dan ID rentang dihasilkan.

    ...
    _, span := tracer.Start(ctx, "spanName")
    defer span.End()
    logEntry := logrus.WithFields(LogrusFields(span))
    logEntry.Info("Ini adalah pesan info dengan ID jejak dan ID rentang")
    ...

Python

OpenTelemetry di Python mendukung penulisan otomatis ID jejak dan ID rentang ke log. Untuk informasi lebih lanjut, lihat Instrumen Logging OpenTelemetry.

Menggunakan logging

  1. Atur variabel lingkungan OTEL_PYTHON_LOG_CORRELATION ke true untuk mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log.

    export OTEL_PYTHON_LOG_CORRELATION=true
  2. Tambahkan %(otelTraceID)s dan %(otelSpanID)s ke format log. OpenTelemetry secara otomatis mengganti %(otelTraceID)s dan %(otelSpanID)s di log dengan ID jejak dan ID rentang.

    • Contoh berikut menunjukkan format log:

      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'
      )
    • Contoh berikut menunjukkan sebuah log:

      2024-06-25 10:00:55,494 INFO [app] [app.py:80] [trace_id=70561de6a164ac991bfff2281b7f**** span_id=4b7f3c798460**** resource.service.name=ot-python-demo] - halo dunia

Contoh operasi

Dalam contoh berikut, aplikasi demo bernama Helloword digunakan untuk menunjukkan cara menulis otomatis ID jejak dan ID rentang ke log di Python.

Sebelum memulai, pastikan Python dan pip telah terinstal. Dalam contoh ini, Python 3.12.4 dan pip 24.1.1 digunakan.

  1. Instal kerangka Flask.

    pip3 install flask

    Output yang diharapkan:

    Successfully installed Jinja2-3.1.4 MarkupSafe-2.1.5 Werkzeug-3.0.3 blinker-1.8.2 click-8.1.7 flask-3.0.3 itsdangerous-2.2.0

    Jika informasi serupa dengan output di atas ditampilkan, instalasi berhasil.

  2. Instal paket dan alat OpenTelemetry Python yang diperlukan.

    pip3 install opentelemetry-distro \
            opentelemetry-exporter-otlp
    opentelemetry-bootstrap -a install

    Output yang diharapkan:

    Successfully installed opentelemetry-instrumentation-dbapi-0.46b0
    Successfully installed opentelemetry-instrumentation-requests-0.46b0
    Successfully installed opentelemetry-instrumentation-urllib3-0.46b0

    Jika informasi serupa dengan output di atas ditampilkan, instalasi berhasil.

  3. Buat aplikasi menggunakan kode contoh.

    import logging
    from logging.handlers import RotatingFileHandler
    from flask import Flask
    
    import os
    
    app = Flask(__name__)
    
    # Buat formatter yang berisi konteks OpenTelemetry.
    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'
    )
    
    # Buat RotatingFileHandler untuk menulis log ke file.
    # Ganti /path/to/app.log dengan jalur sebenarnya dari file log.
    file_handler = RotatingFileHandler('/path/to/app.log', maxBytes=10000, backupCount=1)  
    file_handler.setLevel(logging.INFO)
    file_handler.setFormatter(formatter)
    app.logger.addHandler(file_handler)
    
    @app.route('/')
    def hello_world():
        app.logger.info('Halo Dunia!!!')
        return 'Halo, Dunia!'
    
    if __name__ == '__main__':
        app.run()
    

    Jalankan aplikasi demo. Output yang diharapkan:

    * Running on http://127.0.**.**:5000

    Jika informasi serupa dengan output di atas ditampilkan, penerapan aplikasi berhasil.

  4. Atur variabel lingkungan untuk mengaktifkan penulisan otomatis ID jejak dan ID rentang ke log dan gunakan OpenTelemetry untuk secara otomatis menginstrumen aplikasi demo.

    export OTEL_PYTHON_LOG_CORRELATION=true
    export OTEL_SERVICE_NAME=ot-python-demo
    export OTEL_TRACES_EXPORTER=otlp
    export OTEL_METRICS_EXPORTER=none
    
    # Ganti test.py dengan nama file sebenarnya.
    opentelemetry-instrument python3 test.py
  5. Lihat file log. Contoh berikut menunjukkan sebuah log:

    2024-06-25 10:00:55,494 INFO [app] [test.py:80] [trace_id=70561de6a164ac991bfff2281b7f**** span_id=4b7f3c798460**** resource.service.name=ot-python-demo] - halo dunia

    Dalam contoh ini, ID jejak dan ID rentang dicatat dalam log.

Asosiasi bilateral antara jejak dan Simple Log Service

Mengaitkan log dengan jejak. Untuk informasi lebih lanjut, lihat Asosiasi log.

Mengaitkan jejak dengan log di Simple Log Service. Untuk informasi lebih lanjut, lihat Mengaitkan log aplikasi dengan ID jejak di Simple Log Service.