すべてのプロダクト
Search
ドキュメントセンター

Managed Service for OpenTelemetry:ログへのトレースIDとスパンIDの書き込み

最終更新日:Dec 30, 2024

このトピックでは、OpenTelemetryを使用してトレースIDとスパンIDをログに自動的に書き込む方法について説明します。トレースIDとスパンIDがログに書き込まれた後、分散トレースデータとログデータを関連付けて、より効率的な障害診断とパフォーマンス分析を行うことができます。

Java

サポートされているロギングライブラリ

詳細については、Logger MDC自動インストルメンテーションを参照してください。

ロギングフレームワーク

自動インストルメンテーションをサポートするバージョン

手動インストルメンテーションのために導入する必要がある依存関係

Log4j1

1.2以降

該当なし

Log4j2

2.7以降

opentelemetry-log4j-context-data-2.17-autoconfigure

Logback

1.0以降

opentelemetry-logback-mdc-1.0

Log4j2を使用する

  1. OpenTelemetry Log4j2依存関係をpom.xmlファイルに追加します。

    OPENTELEMETRY_VERSION最新バージョンに置き換えます。

    <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. log4j2.xmlを開き、パターンに%X{trace_id}%X{span_id}を追加して、トレースIDとスパンIDのログへの自動書き込みを有効にします。

    次の例は、ログ形式を示しています。

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

Logbackを使用する

  1. OpenTelemetry Logback依存関係をpom.xmlファイルに追加します。

    OPENTELEMETRY_VERSION最新バージョンに置き換えます。

    <dependencies>
      <dependency>
        <groupId>io.opentelemetry.instrumentation</groupId>
        <artifactId>opentelemetry-logback-mdc-1.0</artifactId>
        <version>OPENTELEMETRY_VERSION</version>
      </dependency>
    </dependencies>
  2. logback.xmlを開き、パターンに%X{trace_id}%X{span_id}を追加して、トレースIDとスパンIDのログへの自動書き込みを有効にします。

    次の例は、ログ形式を示しています。

    <?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>
    
      <!-- ロギングアペンダー(例:ConsoleAppender)をOpenTelemetryAppenderでラップするだけです -->
      <appender name="OTEL" class="io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender">
        <appender-ref ref="CONSOLE"/>
      </appender>
    
      <!-- 元の「CONSOLE」アペンダーの代わりに、ラップされた「OTEL」アペンダーを使用します -->
      <root level="INFO">
        <appender-ref ref="OTEL"/>
      </root>
    
    </configuration>

Logbackを使用する(Spring Bootプロジェクト)

Spring Bootプロジェクトには、デフォルトでLogbackである組み込みのロギングフレームワークがあります。Java Spring Bootプロジェクトを開発している場合は、簡単な構成でトレースIDとスパンIDのログへの自動書き込みを有効にすることができます。

application.propertiesファイルを開き、application.properties%mdc{span_id}をlogging.pattern.levelに追加します。

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

次の例は、いくつかのログを示しています。

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].[/]       : Initializing 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        : Initializing 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        : Completed initialization in 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       : hello world

Go

GoのOpenTelemetryは、トレースIDとスパンIDのログへの自動書き込みをサポートしていません。以下のような追加の開発操作を行わない場合は、トレースIDとスパンIDを手動で記録する必要があります。

logrusを使用する

  1. 依存関係を追加します。

    import (
        oteltrace "go.opentelemetry.io/otel/trace"
        "github.com/sirupsen/logrus"
    )
  2. スパンからトレースIDとスパンIDを抽出し、Logrusログフィールドに追加するツール関数を作成します。

    func LogrusFields(span oteltrace.Span) logrus.Fields {
        return logrus.Fields{
            "trace_id": span.SpanContext().TraceID().String(),
            "span_id": span.SpanContext().SpanID().String(),
        }
    }
  3. スパンが作成された後、トレースIDとスパンIDを持つログが生成されます。

    ...
    _, 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") // トレースIDとスパンIDを含む情報メッセージです
    ...

Python

PythonのOpenTelemetryは、トレースIDとスパンIDのログへの自動書き込みをサポートしています。詳細については、OpenTelemetry Logging Instrumentationを参照してください。

loggingを使用する

  1. OTEL_PYTHON_LOG_CORRELATION環境変数をtrueに設定して、トレースIDとスパンIDのログへの自動書き込みを有効にします。

    export OTEL_PYTHON_LOG_CORRELATION=true
  2. ログ形式に%(otelTraceID)s%(otelSpanID)sを追加します。OpenTelemetryは、ログ内の%(otelTraceID)s%(otelSpanID)sをトレースIDとスパンIDに自動的に置き換えます。

    • 次の例は、ログ形式を示しています。

      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

操作例

次の例では、Hellowordという名前のデモアプリケーションを使用して、PythonでトレースIDとスパンIDをログに自動的に書き込む方法を示します。

開始する前に、Pythonとpipがインストールされていることを確認してください。この例では、Python 3.12.4とpip 24.1.1を使用しています。

  1. Flaskフレームワークをインストールします。

    pip3 install flask

    期待される出力:

    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

    上記の出力と同様の情報が表示された場合は、インストールは成功です。

  2. 必要なOpenTelemetry Pythonパッケージとツールをインストールします。

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

    期待される出力:

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

    上記の出力と同様の情報が表示された場合は、インストールは成功です。

  3. サンプルコードを使用してアプリケーションを作成します。

    import logging
    from logging.handlers import RotatingFileHandler
    from flask import Flask
    
    import os
    
    app = Flask(__name__)
    
    # 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'
    )
    
    # ログをファイルに書き込むRotatingFileHandlerを作成します。
    # /path/to/app.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('Hello World!!!') // Hello World!!!
        return 'Hello, World!'
    
    if __name__ == '__main__':
        app.run()
    

    デモアプリケーションを実行します。期待される出力:

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

    上記の出力と同様の情報が表示された場合は、アプリケーションのデプロイは成功です。

  4. 環境変数を設定して、トレースIDとスパンIDのログへの自動書き込みを有効にし、OpenTelemetryを使用してデモアプリケーションを自動的にインストルメントします。

    export OTEL_PYTHON_LOG_CORRELATION=true
    export OTEL_SERVICE_NAME=ot-python-demo
    export OTEL_TRACES_EXPORTER=otlp
    export OTEL_METRICS_EXPORTER=none
    
    # test.pyを実際のファイル名に置き換えます。
    opentelemetry-instrument python3 test.py
  5. ログファイルを表示します。次の例は、ログを示しています。

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

    この例では、トレースIDとスパンIDがログに記録されています。

トレースとSimple Log Service間の双方向の関連付け

ログをトレースに関連付けます。詳細については、ログの関連付けを参照してください。

Simple Log Serviceのログをトレースに関連付けます。詳細については、Simple Log ServiceのアプリケーションログをトレースIDに関連付けるを参照してください。