トレース ID を Java アプリケーションのビジネスログと関連付けることで、問題発生時にトレース ID で関連ログを迅速に検索し、問題の解決を迅速化できます。
前提条件
この機能は、Application Real-Time Monitoring Service (ARMS) の Basic edition ではサポートされていません。
エージェントのバージョンが 2.6.1.2 以降であること。詳細については、「Java エージェントの更新」をご参照ください。
Simple Log Service (SLS) を使用したログ収集が設定されていること。詳細については、「データ収集の概要」をご参照ください。
背景情報
ARMS は、Mapped Diagnostic Context (MDC) メカニズムを使用してトレース ID とビジネスログを関連付け、Log4j、Log4j2、Logback をサポートしています。
関連付けの有効化
ARMS コンソールにログインします。 左側のナビゲーションウィンドウで、 を選択します。
上部のメニューバーでリージョンを選択し、対象のアプリケーション名をクリックします。
説明[Language] 列のアイコンは、アプリケーションのプログラミング言語を示します。
:Java
:Go
:Python[-] (ハイフン):Managed Service for OpenTelemetry で監視されているアプリケーション
上部のメニューバーで、 を選択します。
カスタム設定 タブの [Application Log Association Configuration] セクションで、[Log Source] を [SLS] に設定します。[Associate Business Logs with trace ID] スイッチをオンにし、SLS プロジェクトのリージョンを選択して、プロジェクトと Logstore をバインドします。
必要に応じて、[Logs are automatically populated with trace ID] および [Logs are automatically populated with span ID] スイッチをオンにすることもできます。
[Logs are automatically populated with trace ID] および [Logs are automatically populated with span ID] 機能には、エージェントのバージョンが 4.1.6 以降が必要です。SLS をバインドする際は、[Associated Index] も選択する必要があります。フィールドインデックスまたはフルテキストインデックスのいずれかを指定できます。
説明このスイッチをオンにすると、トレース ID がビジネスログに自動的に追加されるため、手順 5 の手動設定をスキップできます。
ビジネス例外も特定する場合は、「トレースとログ分析を使用したビジネス例外のトラブルシューティング」をご参照ください。
(オプション) トレース ID を手動で関連付けます。
ビジネスログレイアウトの
Pattern属性に、%X{EagleEye-TraceID}を追加します。SkyWalking プロトコルを使用する場合は、代わりに%X{Skywalking-TraceID}を追加します。ACK OnePilot (ARMS 内製エージェント) を使用してアプリケーションをオンボーディングする場合、トレース ID の形式は%X{EagleEye-TraceID}です。スパン ID も関連付ける場合は、
%X{span_id}を追加します。重要スパン ID の関連付けには、エージェントのバージョン 4.x 以降が必要です。
ビジネスコードで
{EagleEye-TraceID}を取得する方法については、「ARMS SDK for Java (非推奨)」をご参照ください。
以下の例は、Log4j、Log4j2、Logback の設定ファイルを変更する方法を示しています。
Log4j 設定ファイル log4j.properties の変更例:
log4j.appender.warn.layout=org.apache.log4j.PatternLayout log4j.appender.warn.layout.ConversionPattern=%-d{yyyy-MM-dd HH:mm:ss}-[%p]-(%C:%L) - traceId:%X{EagleEye-TraceID} - spanId:%X{span_id} - %m%nLog4j2 設定ファイル log4j2.xml の変更例:
PatternLayout
<console name="Console" target="SYSTEM_OUT"> <ThresholdFilter level="INFO" onMatch="ACCEPT" onMismatch="DENY"/> <PatternLayout pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - traceId:%X{EagleEye-TraceID} - spanId:%X{span_id} - %m%n"/> </console>JsonLayout
<JsonLayout complete="false" compact="true" eventEol="true" properties="false" locationInfo="true" includeStacktrace="true" stacktraceAsString="true" objectMessageAsJsonObject="true" > <KeyValuePair key="EagleEye-TraceID" value="${ctx:EagleEye-TraceID}" /> <KeyValuePair key="span_id" value="${ctx:span_id}" /> </JsonLayout>Logback 設定ファイル logback.xml の変更例:
PatternLayout
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - traceId:%X{EagleEye-TraceID} - spanId:%X{span_id} - %msg%n</pattern> </encoder>JsonLayout
<encoder class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder"> <providers> <timestamp/> <threadName/> <logLevel/> <loggerName/> <message/> <callerData/> <stackTrace/> <pattern> <pattern> { "EagleEye-TraceID": "%X{EagleEye-TraceID}", "span_id": "%X{span_id}" } </pattern> </pattern> </providers> </encoder>
アプリケーションを再起動します。
ビジネスログにトレース ID が表示されれば、関連付けは成功です。出力例:
2023-02-15 15:03:43-[INFO]-(com.example....HelloController:17) - traceId:ea1e0fe79b16764446 this is an info message 2023-02-15 15:03:43-[ERROR]-(com.example....HelloController:19) - traceId:ea1e0fe79b16764446 - this is an error message 2023-02-15 15:03:43-[WARN]-(com.example....HelloController:21) - traceId:ea1e0fe79b16764446 this is a warn message(オプション) SLS ログ収集を設定して、アプリケーションログを前の手順でバインドしたプロジェクトと Logstore にアップロードします。
デフォルトでは、ARMS はアプリケーションログを収集しません。