

# 启用跟踪与日志关联
<a name="Application-Signals-TraceLogCorrelation"></a>

您可以在 Application Signals 中启用*跟踪与日志关联*。这会自动将跟踪 ID 和跨度 ID 注入到相关的应用程序日志中。然后，当您在 Application Signals 控制台中打开跟踪详细信息页面时，与当前跟踪相关的相关日志条目（如果有）会自动出现在页面底部。

例如，假设您注意到延迟图中出现了一个峰值。您可以选择图表上的点来加载该时间点的诊断信息。然后，您可以选择相关的跟踪以获取更多信息。查看跟踪信息时，可以向下滚动以查看与跟踪相关的日志。这些日志可能会显示与导致延迟峰值的问题相关的模式或错误代码。

为了实现跟踪日志关联，Application Signals 依赖于以下内容：
+ [适用于 Java 的 Logger MDC 自动检测](https://github.com/open-telemetry/opentelemetry-java-instrumentation/blob/main/docs/logger-mdc-instrumentation.md)。
+ 适用于 Python 的 [OpenTelemetry Logging Instrumentation](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 上，无需采取进一步操作。
+ 在 Amazon ECS 上，无需任何进一步的操作。
+ 在 Amazon EC2 上，请参阅 [步骤 3：检测您的应用程序并将其启动](CloudWatch-Application-Signals-Enable-EC2Main.md#CloudWatch-Application-Signals-Enable-Other-instrument) 中过程的步骤 4。

启用跟踪日志关联后，

## 跟踪日志关联设置示例
<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
```

**Logback for Java**

在日志记录配置（例如 logback.xml）中，将跟踪上下文 `trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p` 插入到编码器的 `pattern` 中。例如，以下配置在日志消息之前添加跟踪上下文。

```
<appender name="FILE" class="ch.qos.logback.core.FileAppender">
  <file>app.log</file>
  <append>true</append>
  <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>
  <File name="FILE" fileName="app.log">
    <PatternLayout pattern="trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p - %m%n"/>
  </File>
</Appenders>
```

有关 Log4j2 中模式布局的更多信息，请参阅 Log4j2 文档中的 [Pattern Layout](https://logging.apache.org/log4j/2.x/manual/layouts.html#Pattern_Layout)。

**Log4j for Java**

在日志记录配置（例如 log4j.xml）中，将跟踪上下文 `trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{trace_flags} %5p` 插入到 `PatternLayout` 中。例如，以下配置在日志消息之前添加跟踪上下文。

```
<appender name="FILE" class="org.apache.log4j.FileAppender">;
  <param name="File" value="app.log"/>;
  <param name="Append" value="true"/>;
  <layout class="org.apache.log4j.PatternLayout">;
    <param name="ConversionPattern" value="trace_id=%mdc{trace_id} span_id=%mdc{span_id} trace_flags=%mdc{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 的 [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 使用文档。