分散システムでリクエストが失敗した場合、相関キーがなければ、サービスをまたいで関連ログを見つけることは困難です。 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 successfullySLS との連携や検証を含む完全な設定については、以降のセクションに進んでください。
前提条件
ARMS によってモニタリングされている Python アプリケーション。 詳細については、「Python アプリケーションのモニタリング」をご参照ください。
SLS を通じて収集されるアプリケーションログ。 詳細については、「データ収集の概要」をご参照ください。
SLS と ARMS の連携
SLS プロジェクトと Logstore を ARMS に連携させることで、コンソールでトレースとログを関連付けることができます。
ARMS コンソールにログインします。
左側のナビゲーションウィンドウで、 を選択します。
上部のナビゲーションバーでリージョンを選択し、対象のアプリケーションをクリックします。
説明[言語] 列のアイコンは、プログラミング言語を示します。 -
: Java -
: Go -
: Python - - (ハイフン): OpenTelemetry 向けマネージドサービスでモニタリングされているアプリケーション上部のナビゲーションバーで、[構成] > [カスタム構成] を選択します。
[アプリケーションログの関連付け設定] セクションで、[ログソース] を [ログサービス SLS] に設定します。 SLS がデプロイされているリージョンを選択し、プロジェクトと Logstore を連携させます。

トレースとログの相関付けの有効化
3 つの環境変数を設定して、トレースコンテキストのインジェクションを有効にし、ログフォーマットを定義します。
環境変数
| 変数 | 目的 | デフォルト |
|---|---|---|
OTEL_PYTHON_LOG_CORRELATION | トレースとログの相関付けを有効または無効にします。 true に設定すると有効になります。 false に設定するか、空のままにすると、相関付けは無効になります。 | false |
OTEL_PYTHON_LOG_LEVEL | 相関付けの最小ログレベル。 有効な値: debug、info、warning、error。 | - |
OTEL_PYTHON_LOG_FORMAT | ログ出力のフォーマット文字列。 ビジネス要件に基づいて値をカスタマイズできます。 以下のトレースコンテキストフィールドを使用して、ログ出力にトレースコンテキストを含めます。 | - |
トレースコンテキストフィールド
OTEL_PYTHON_LOG_FORMAT のフォーマット文字列でこれらのフィールドを使用して、ログ出力にトレースコンテキストを含めます。
| フィールド | 説明 |
|---|---|
%(otelTraceID)s | ログを分散トレースにリンクするトレース ID |
%(otelSpanID)s | 現在のログによって生成されたスパンの ID |
%(otelTraceSampled)s | トレースがサンプリングされているかどうか (True または False) |
%(otelServiceName)s | ARMS に登録されているアプリケーション名 |
環境変数の設定
アプリケーションを起動する前に、次の環境変数を設定します。
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'アプリケーションの起動後、ログ出力にトレースコンテキストが含まれるようになります。

カスタムハンドラへのトレースコンテキストの追加
トレースコンテキストは、ルートロガーにのみ自動的にインジェクションされます。 カスタムハンドラを使用する場合は、そのフォーマッターが環境変数 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 のログ収集の詳細については、「データ収集の概要」をご参照ください。
設定の確認
アプリケーションにテストリクエストを送信します。
アプリケーションのログ出力を確認します。 トレースされたリクエスト内で生成される各ログ行には、ゼロ以外の
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 successfullyARMS コンソールで、リクエストのトレース詳細ページを開き、関連付けられたログに正しいトレース ID が表示されていることを確認します。