

# ログ相関のトレースを有効にする
<a name="Application-Signals-TraceLogCorrelation"></a>

Application Signals で*ログ相関のトレース*を有効にできます。これにより、トレース ID とスパン ID が関連するアプリケーションログに自動的に挿入されます。次に、Application Signals コンソールでトレースの詳細ページを開くと、現在のトレースに関連するログエントリがあれば、ページの下部に自動的に表示されます。

例えば、レイテンシーグラフにスパイクがあることに気付いたとします。グラフ上のそのポイントを選択すると、その時点の診断情報をロードできます。次に、関連するトレースを選択すると、詳細情報が表示されます。トレース情報を表示すると、下にスクロールしてそのトレースに関連付けられているログを参照できます。こうしたログを調べると、レイテンシーのスパイクを引き起こしている問題を突き止め、関連するパターンやエラーコードを明らかにできる可能性があります。

**トレースログ相関を設定する前にアプリケーションを計装する**  
トレースログ相関を設定する前に、Application Signals 用にアプリケーションがすでに計装されている必要があります。Application Signals の計装により、ランタイム時に `trace_id`、`span_id`、および `trace_flags` の MDC 値が設定されます。計装がない場合、これらの値は空のままとなり (例えば、`trace_id=`)、相関機能は動作しません。

トレースログの相関を実現するために、Application Signals は以下を利用します。
+ Java の場合は [Logger MDC 自動計測](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/logger-mdc-instrumentation.md)。
+ Python の場合は [OpenTelemetry Logging 計測](https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/logging/logging.html)。
+ Node.js の場合は [Pino](https://www.npmjs.com/package/@opentelemetry/instrumentation-pino)、[Winston](https://www.npmjs.com/package/@opentelemetry/instrumentation-winston)、または [Bunyan](https://www.npmjs.com/package/@opentelemetry/instrumentation-bunyan) 自動計測。

OpenTelemetry コミュニティは、これらの計装をすべて提供しています。Application Signals は、これらを使用して、トレース ID やスパン ID などのトレースコンテキストをアプリケーションログに挿入します。これを有効にするには、自動計測を有効にするようにログ記録設定を手動で変更する必要があります。

アプリケーションが動作するアーキテクチャによっては、このセクションのステップに従うだけでなく、トレースログの相関を有効にする環境変数も設定する必要があります。
+ Amazon EKS では、追加の環境変数は必要ありません。以下の例で説明されているように、ログ出力の設定はまだ必要であり、Container Insights がログを収集できるように、ロガーは stdout に書き込む必要があります。
+ Amazon ECS では、追加の環境変数は必要ありません。以下の例で説明されているように、ログ出力の設定はまだ必要であり、Container Insights がログを収集できるように、ロガーは stdout に書き込む必要があります。
+ Amazon EC2 では、「[ステップ 3: 計測を設定しアプリケーションを起動する](CloudWatch-Application-Signals-Enable-EC2Main.md#CloudWatch-Application-Signals-Enable-Other-instrument)」の手順のステップ 4 を参照してください。

**OpenTelemetry Container Insights はトレースログ相関を自動的に有効にしません**  
[CloudWatch Observability EKS アドオン](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/container-insights-eks-otel-install-addon.html) などを介して OpenTelemetry ベースの Container Insights ログ収集パスを有効にしても、コンテナログは CloudWatch Logs に収集されて転送されますが、Application Signals 用にアプリケーションが計装されるわけではなく、それらのログにトレースコンテキストが注入されるわけではありません。トレースとログを相関させるには、Application Signals の計装を個別に有効にし、*かつ*、このページで説明されているとおりにログパターンを設定する必要があります。

トレースログ相関を有効にした後、トレース詳細ページを開くと、同じトレース ID を含むログエントリが自動的にページの下部に表示されます。トレースログ相関を使用すると、手動で検索せずに、トレースから関連するアプリケーションログへ迅速に移行できます。

## トレースログの相関の設定例
<a name="Application-Signals-TraceLogCorrelation-Examples"></a>

このセクションでは、いくつかの環境でトレースログの相関を設定する例を示します。

**Spring Boot for Java**

`custom-app` というフォルダに Spring Boot アプリケーションがあるとします。このアプリケーション設定は通常、`custom-app/src/main/resources/application.yml` という名前の YAML ファイルであり、次のようになります。

```
spring:
  application:
    name: custom-app
  config:
    import: optional:configserver:${CONFIG_SERVER_URL:http://localhost:8888/}
    
...
```

トレースログの相関を有効にするには、次のログ記録設定を追加します。

```
spring:
  application:
    name: custom-app
  config:
    import: optional:configserver:${CONFIG_SERVER_URL:http://localhost:8888/}
    
...    

logging:
  pattern:
    level: trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p
```

**Spring Boot と XML 構成は代替手段です**  
Spring Boot の `application.yml` (`logging.pattern.level`) アプローチと、次のセクションに示す Logback/Log4j2/Log4j XML 構成アプローチは*代替手段*です。両方ではなく、どちらか一方を使用してください。`application.yml` でパターンを設定すると、Spring Boot のデフォルトの Logback 構成によって自動的に認識され、別の `logback.xml` は必要ありません。

**EKS および ECS: ログを stdout に書き込む**  
Container Insights は、コンテナ内で書き込まれたファイルではなく、コンテナの stdout/stderr からログを収集します。ロガーがコンソール (stdout) に書き込むように設定します。`app.log` のようなファイルに書き込む FileAppender は、正しくトレース/タグ付けされた行を生成しますが、これらは収集されず、トレース詳細ページに相関されて表示されることはありません。ファイルにログ記録する必要がある場合は、そのファイルをさらに転送する必要もあります (例えば、共有ボリュームを読み取るサイドカーコレクターなど)。これはこのページのスコープ外です。

**Logback for Java**

ログ記録設定 (logback.xml など) で、トレースコンテキスト `trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p` をエンコーダーの `pattern` に挿入します。例えば、以下の設定はトレースコンテキストの先頭にログメッセージを付加します。

```
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  <encoder> 
    <pattern>trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p - %m%n</pattern> 
  </encoder>
</appender>
```

Logback のエンコーダーの詳細については、Logback ドキュメントの「[Encoders](https://logback.qos.ch/manual/encoders.html)」を参照してください。

**Log4j2 for Java**

ログ記録設定 (log4j2.xml など) で、トレースコンテキスト `trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p` を `PatternLayout` に挿入します。例えば、以下の設定はトレースコンテキストの先頭にログメッセージを付加します。

```
<Appenders>
  <Console name="CONSOLE" target="SYSTEM_OUT">
    <PatternLayout pattern="trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p - %m%n"/>
  </Console>
</Appenders>
```

Log4j2 のパターンレイアウトの詳細については、Log4j2 ドキュメントの「[Pattern Layout](https://logging.apache.org/log4j/2.x/manual/layouts.html#Pattern_Layout)」を参照してください。

**Log4j for Java**

ログ記録設定 (log4j.xml など) で、トレースコンテキスト `trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %5p` を `PatternLayout` に挿入します。例えば、以下の設定はトレースコンテキストの先頭にログメッセージを付加します。

```
<appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
  <layout class="org.apache.log4j.PatternLayout">
    <param name="ConversionPattern" value="trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %5p - %m%n"/>
  </layout>
</appender>
```

Log4j のパターンレイアウトの詳細については、Log4j ドキュメントの「[Class Pattern Layout](https://logging.apache.org/log4j/1.x/apidocs/org/apache/log4j/PatternLayout.html)」を参照してください。

**Python**: 

アプリケーションの実行中に環境変数 `OTEL_PYTHON_LOG_CORRELATION` を `true` に設定します。詳細については、Python OpenTelemetry ドキュメントの「[Enable trace context injection](https://opentelemetry-python-contrib.readthedocs.io/en/latest/instrumentation/logging/logging.html#enable-trace-context-injection)」を参照してください。

**Node.js**

Node.js 対応のロギングライブラリを使用できるように Node.js でトレースコンテキストの挿入を有効にする方法の詳細については、Node.js での [Pino](https://www.npmjs.com/package/@opentelemetry/instrumentation-pino)、[Winston](https://www.npmjs.com/package/@opentelemetry/instrumentation-winston)、[Bunyan](https://www.npmjs.com/package/@opentelemetry/instrumentation-bunyan) のいずれかの自動計測に NPM を使用する方法を解説したドキュメントを参照してください。

### セットアップを確認する
<a name="Application-Signals-TraceLogCorrelation-Verify"></a>

アプリケーションを再デプロイした後、ログ行に `trace_id` が設定されていることを確認してください (例えば、`kubectl logs {{pod-name}}` を実行するなど)。次に、Application Signals コンソールでトレース詳細ページを開き、相関ログエントリがページの下部に表示されることを確認してください。

Amazon EKS では、ログは Container Insights アプリケーションロググループ (`/aws/containerinsights/{{cluster-name}}/application`、または OpenTelemetry Container Insights ログパスが有効な場合は `/aws/otel/containerinsights/{{cluster-name}}/application`) に書き込まれます。