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

Application Real-Time Monitoring Service:Python アプリケーションのログとトレース ID の関連付け

最終更新日:Jul 25, 2026

分散システムでリクエストが失敗した場合、相関キーがなければ、サービスをまたいで関連ログを見つけることは困難です。 Application Real-Time Monitoring Service (ARMS) は、OpenTelemetry のトレースコンテキスト (トレース ID、スパン ID、サービス名) を Python のログレコードにインジェクションすることで、この問題を解決します。 これにより、Simple Log Service (SLS) でトレース ID を使用してログを検索し、根本原因を特定できます。

仕組み: ARMS の Python エージェントは、Python の標準 logging モジュールにフックし、各 LogRecord にトレースコンテキストフィールドを追加します。 エージェントはインジェクションのみを処理し、ログの収集や転送は行いません。 ログ配信は、独立したログ収集パイプライン (通常は SLS) によって処理されます。

重要

Python の標準 logging モジュールのみが、環境変数 OTEL_PYTHON_LOG_CORRELATION を介したトレースコンテキストの自動インジェクションをサポートしています。 Structlog やその他のサードパーティフレームワークは、自動インジェクションをサポートしていません。

クイックスタート

3 つの環境変数を設定し、アプリケーションを再起動します。

export OTEL_PYTHON_LOG_CORRELATION=true
export OTEL_PYTHON_LOG_LEVEL=info
export OTEL_PYTHON_LOG_FORMAT='%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s resource.service.name=%(otelServiceName)s trace_sampled=%(otelTraceSampled)s] - %(message)s'

アプリケーションの再起動後、トレースされたリクエスト内で生成される各ログ行には、トレースコンテキストが含まれます。

2026-03-10 14:30:00,123 INFO [my_app] [app.py:42] [trace_id=ac1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6 span_id=1a2b3c4d5e6f7a8b resource.service.name=my-python-app trace_sampled=True] - Order created successfully

SLS との連携や検証を含む完全な設定については、以降のセクションに進んでください。

前提条件

SLS と ARMS の連携

SLS プロジェクトと Logstore を ARMS に連携させることで、コンソールでトレースとログを関連付けることができます。

  1. ARMS コンソールにログインします。

  2. 左側のナビゲーションウィンドウで、[アプリケーションモニタリング] > [アプリケーションリスト] を選択します。

  3. 上部のナビゲーションバーでリージョンを選択し、対象のアプリケーションをクリックします。

    説明

    [言語] 列のアイコンは、プログラミング言語を示します。 - Java icon: Java - Go icon: Go - Python icon: Python - - (ハイフン): OpenTelemetry 向けマネージドサービスでモニタリングされているアプリケーション

  4. 上部のナビゲーションバーで、[構成] > [カスタム構成] を選択します。

  5. [アプリケーションログの関連付け設定] セクションで、[ログソース][ログサービス SLS] に設定します。 SLS がデプロイされているリージョンを選択し、プロジェクトと Logstore を連携させます。

    Application log Association configuration

トレースとログの相関付けの有効化

3 つの環境変数を設定して、トレースコンテキストのインジェクションを有効にし、ログフォーマットを定義します。

環境変数

変数目的デフォルト
OTEL_PYTHON_LOG_CORRELATIONトレースとログの相関付けを有効または無効にします。 true に設定すると有効になります。 false に設定するか、空のままにすると、相関付けは無効になります。false
OTEL_PYTHON_LOG_LEVEL相関付けの最小ログレベル。 有効な値: debuginfowarningerror-
OTEL_PYTHON_LOG_FORMATログ出力のフォーマット文字列。 ビジネス要件に基づいて値をカスタマイズできます。 以下のトレースコンテキストフィールドを使用して、ログ出力にトレースコンテキストを含めます。-

トレースコンテキストフィールド

OTEL_PYTHON_LOG_FORMAT のフォーマット文字列でこれらのフィールドを使用して、ログ出力にトレースコンテキストを含めます。

フィールド説明
%(otelTraceID)sログを分散トレースにリンクするトレース ID
%(otelSpanID)s現在のログによって生成されたスパンの ID
%(otelTraceSampled)sトレースがサンプリングされているかどうか (True または False)
%(otelServiceName)sARMS に登録されているアプリケーション名

環境変数の設定

アプリケーションを起動する前に、次の環境変数を設定します。

export OTEL_PYTHON_LOG_CORRELATION=true
export OTEL_PYTHON_LOG_LEVEL=info
export OTEL_PYTHON_LOG_FORMAT='%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s resource.service.name=%(otelServiceName)s trace_sampled=%(otelTraceSampled)s] - %(message)s'

アプリケーションの起動後、ログ出力にトレースコンテキストが含まれるようになります。

Log output with trace context

カスタムハンドラへのトレースコンテキストの追加

トレースコンテキストは、ルートロガーにのみ自動的にインジェクションされます。 カスタムハンドラを使用する場合は、そのフォーマッターが環境変数 OTEL_PYTHON_LOG_FORMAT から読み取るように設定します。

import os
import logging

# 環境変数からフォーマット文字列を読み取ります
log_format = os.getenv('OTEL_PYTHON_LOG_FORMAT')

# トレースコンテキストフィールドを持つカスタムハンドラを作成します
my_handler = logging.StreamHandler()
formatter = logging.Formatter(log_format)
my_handler.setFormatter(formatter)

# ハンドラをロガーにアタッチします
logger = logging.getLogger('my_module')
logger.addHandler(my_handler)
logger.setLevel(logging.INFO)

structlog へのトレースコンテキストの追加

アプリケーションで structlog を使用している場合、トレースコンテキストの自動インジェクションはサポートされていません。 OpenTelemetry SDK からトレースコンテキストを読み取るカスタムプロセッサを structlog パイプラインに追加します。

from opentelemetry import trace
import structlog

def add_otel_context(logger, method, event_dict):
    span = trace.get_current_span()
    ctx = span.get_span_context()
    if ctx.is_valid:
        event_dict['trace_id'] = format(ctx.trace_id, '032x')
        event_dict['span_id'] = format(ctx.span_id, '016x')
    return event_dict

structlog.configure(
    processors=[
        add_otel_context,
        structlog.processors.JSONRenderer(),
    ]
)

設定後、トレースされたリクエスト内で生成される各 structlog ログエントリには、trace_id フィールドと span_id フィールドが含まれます。 SLS はこれらのフィールドを使用して、ログを対応する分散トレースと関連付けます。

ログ収集の設定 (任意)

ARMS の Python エージェントは、ログレコードへのトレースコンテキストフィールドのインジェクションのみを担当します。 アプリケーションログの収集や転送は行いません。 アプリケーションログは SLS によって直接収集されるため、OpenTelemetry コンソールへの追加のレポートは不要です。

ARMS コンソールで関連付けられたログを表示するには、アプリケーションからログを収集し、「SLS と ARMS の連携」で連携した SLS プロジェクトおよび Logstore に配信するように SLS を設定します。

SLS のログ収集の詳細については、「データ収集の概要」をご参照ください。

設定の確認

  1. アプリケーションにテストリクエストを送信します。

  2. アプリケーションのログ出力を確認します。 トレースされたリクエスト内で生成される各ログ行には、ゼロ以外の trace_id 値が含まれています。

       2026-03-10 14:30:00,123 INFO [my_app] [app.py:42] [trace_id=ac1b2d3e4f5a6b7c8d9e0f1a2b3c4d5e6 span_id=1a2b3c4d5e6f7a8b resource.service.name=my-python-app trace_sampled=True] - Order created successfully
  3. ARMS コンソールで、リクエストのトレース詳細ページを開き、関連付けられたログに正しいトレース ID が表示されていることを確認します。