日本熟妇hd丰满老熟妇,中文字幕一区二区三区在线不卡 ,亚洲成片在线观看,免费女同在线一区二区

將TraceId和SpanId寫(xiě)入日志

本文介紹如何使用OpenTelemetry將TraceId和SpanId自動(dòng)寫(xiě)入日志。TraceId與SpanId寫(xiě)入日志后,您可以將分布式鏈路數(shù)據(jù)與日志數(shù)據(jù)關(guān)聯(lián)起來(lái),實(shí)現(xiàn)更高效的故障診斷和性能分析。

Java

支持的日志庫(kù)

更多信息,請(qǐng)參見(jiàn) Logger MDC auto-instrumentation。

日志框架

自動(dòng)埋點(diǎn)支持的版本

手動(dòng)埋點(diǎn)需要引入的依賴

Log4j1

1.2+

無(wú)

Log4j2

2.7+

opentelemetry-log4j-context-data-2.17-autoconfigure

Logback

1.0+

opentelemetry-logback-mdc-1.0

使用Log4j2

  1. 在pom.xml中添加OpenTelemetry Log4j2依賴。

    請(qǐng)將OPENTELEMETRY_VERSION替換為最新版本。

    <dependencies>
      <dependency>
        <groupId>io.opentelemetry.instrumentation</groupId>
        <artifactId>opentelemetry-log4j-context-data-2.17-autoconfigure</artifactId>
        <version>OPENTELEMETRY_VERSION</version>
        <scope>runtime</scope>
      </dependency>
    </dependencies>
  2. 修改log4j2.xml配置,在pattern中添加%X{trace_id} %X{span_id},可以將TraceId與SpanId自動(dòng)寫(xiě)入日志。

    以下為日志格式示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <Configuration>
      <Appenders>
        <Console name="Console" target="SYSTEM_OUT">
          <PatternLayout
              pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} - %msg%n"/>
        </Console>
      </Appenders>
      <Loggers>
        <Root>
          <AppenderRef ref="Console" level="All"/>
        </Root>
      </Loggers>
    </Configuration>

使用Logback

  1. 在pom.xml中添加OpenTelemetry Logback依賴。

    請(qǐng)將OPENTELEMETRY_VERSION替換為最新版本。

    <dependencies>
      <dependency>
        <groupId>io.opentelemetry.instrumentation</groupId>
        <artifactId>opentelemetry-logback-mdc-1.0</artifactId>
        <version>OPENTELEMETRY_VERSION</version>
      </dependency>
    </dependencies>
  2. 修改logback.xml配置,在pattern中添加%X{trace_id} %X{span_id},可以將TraceId與SpanId自動(dòng)寫(xiě)入日志。

    以下為日志格式示例:

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration>
      <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
          <pattern>%d{HH:mm:ss.SSS} trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %msg%n</pattern>
        </encoder>
      </appender>
    
      <!-- Just wrap your logging appender, for example ConsoleAppender, with OpenTelemetryAppender -->
      <appender name="OTEL" class="io.opentelemetry.instrumentation.logback.mdc.v1_0.OpenTelemetryAppender">
        <appender-ref ref="CONSOLE"/>
      </appender>
    
      <!-- Use the wrapped "OTEL" appender instead of the original "CONSOLE" one -->
      <root level="INFO">
        <appender-ref ref="OTEL"/>
      </root>
    
    </configuration>

使用Logback(SpringBoot項(xiàng)目)

Spring Boot項(xiàng)目?jī)?nèi)置了日志框架,并且默認(rèn)使用Logback作為其日志實(shí)現(xiàn)。如果您的Java項(xiàng)目為SpringBoot項(xiàng)目,只需少量配置即可將TraceId寫(xiě)入日志。

在application.properties中設(shè)置logging.pattern.level,添加%mdc{trace_id}%mdc{span_id}到日志中。

logging.pattern.level=trace_id=%mdc{trace_id} span_id=%mdc{span_id} %5p

以下為日志示例:

2024-06-26 10:56:31.200 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=1b08f18b8858bb9a  INFO 53724 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2024-06-26 10:56:31.201 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=1b08f18b8858bb9a  INFO 53724 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2024-06-26 10:56:31.209 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=1b08f18b8858bb9a  INFO 53724 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 8 ms
2024-06-26 10:56:31.296 trace_id=8f7ebd8a73f9a8f50e6a00a87a20952a span_id=5743699405074f4e  INFO 53724 --- [nio-8081-exec-1] com.example.httpserver.ot.OTServer       : hello world

Go

OpenTelemetry Go不支持自動(dòng)注入,需要在記錄日志時(shí)手動(dòng)注入TraceId和SpanId。

使用logrus

  1. 引入依賴。

    import (
        oteltrace "go.opentelemetry.io/otel/trace"
        "github.com/sirupsen/logrus"
    )
  2. 創(chuàng)建工具函數(shù),從Span中提取SpanID和TraceID,并添加到Logrus日志字段。

    func LogrusFields(span oteltrace.Span) logrus.Fields {
        return logrus.Fields{
            "trace_id": span.SpanContext().TraceID().String(),
            "span_id": span.SpanContext().SpanID().String(),
        }
    }
  3. 創(chuàng)建一個(gè)Span后,即可記錄帶有TraceId和SpanId的日志。

    ...
    _, span := tracer.Start(ctx, "spanName")
    defer span.End()
    logEntry := logrus.WithFields(LogrusFields(span))
    logEntry.Info("This is an info message with trace and span ID")
    ...

Python

OpenTelemetry Python支持自動(dòng)將TraceId與SpanId注入到日志中。更多信息,請(qǐng)參見(jiàn) OpenTelemetry Logging Instrumentation

使用logging

  1. 設(shè)置環(huán)境變量OTEL_PYTHON_LOG_CORRELATION為true,開(kāi)啟自動(dòng)將TraceId與SpanId添加到日志條目中的能力。

    export OTEL_PYTHON_LOG_CORRELATION=true
  2. 在日志格式中添加%(otelTraceID)s%(otelSpanID)s,OpenTelemetry會(huì)自動(dòng)將日志中的 %(otelTraceID)s%(otelSpanID)s替換為T(mén)raceId和SpanId。

    • 以下為logging.Formatter示例。

      formatter = logging.Formatter(
          '%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s resource.service.name=%(otelServiceName)s] - %(message)s'
      )
    • 以下為日志示例。

      2024-06-25 10:00:55,494 INFO [app] [app.py:80] [trace_id=70561de6a164ac991bfff2281b7f**** span_id=4b7f3c798460**** resource.service.name=ot-python-demo] - hello world

操作示例

下文將以Demo應(yīng)用Helloword為例,說(shuō)明如何在Python中自動(dòng)將TraceId與SpanId注入到日志中。

請(qǐng)確保您已安裝Python和pip。本示例使用的是Python 3.12.4、pip 24.1.1。

  1. 安裝本示例使用到的Flask框架。

    pip3 install flask

    預(yù)期輸出:

    Successfully installed Jinja2-3.1.4 MarkupSafe-2.1.5 Werkzeug-3.0.3 blinker-1.8.2 click-8.1.7 flask-3.0.3 itsdangerous-2.2.0

    輸出類(lèi)似信息,說(shuō)明Flask框架安裝成功。

  2. 安裝OpenTelemetry Python相關(guān)的包和工具。

    pip3 install opentelemetry-distro \
            opentelemetry-exporter-otlp
    opentelemetry-bootstrap -a install

    預(yù)期輸出:

    Successfully installed opentelemetry-instrumentation-dbapi-0.46b0
    Successfully installed opentelemetry-instrumentation-requests-0.46b0
    Successfully installed opentelemetry-instrumentation-urllib3-0.46b0

    輸出類(lèi)似信息,說(shuō)明OpenTelemetry Python相關(guān)的包和工具安裝成功。

  3. 創(chuàng)建Demo應(yīng)用。

    import logging
    from logging.handlers import RotatingFileHandler
    from flask import Flask
    
    import os
    
    app = Flask(__name__)
    
    # 創(chuàng)建格式化器,其中包含OpenTelemetry上下文信息
    formatter = logging.Formatter(
        '%(asctime)s %(levelname)s [%(name)s] [%(filename)s:%(lineno)d] [trace_id=%(otelTraceID)s span_id=%(otelSpanID)s resource.service.name=%(otelServiceName)s] - %(message)s'
    )
    
    # 創(chuàng)建一個(gè)RotatingFileHandler來(lái)記錄日志到文件
    # 注意將/path/to/app.log替換為您的日志文件存放的實(shí)際路徑
    file_handler = RotatingFileHandler('/path/to/app.log', maxBytes=10000, backupCount=1)  
    file_handler.setLevel(logging.INFO)
    file_handler.setFormatter(formatter)
    app.logger.addHandler(file_handler)
    
    @app.route('/')
    def hello_world():
        app.logger.info('Hello World!!!')
        return 'Hello, World!'
    
    if __name__ == '__main__':
        app.run()
    

    運(yùn)行Demo應(yīng)用,預(yù)期輸出:

    * Running on http://127.0.**.**:5000

    說(shuō)明應(yīng)用部署成功。

  4. 設(shè)置環(huán)境變量,開(kāi)啟自動(dòng)將TraceId與SpanId添加到日志條目中的能力,并自動(dòng)將OpenTelemetry的儀器化代碼植入應(yīng)用程序中。

    export OTEL_PYTHON_LOG_CORRELATION=true
    export OTEL_SERVICE_NAME=ot-python-demo
    export OTEL_TRACES_EXPORTER=otlp
    export OTEL_METRICS_EXPORTER=none
    
    # 請(qǐng)將test.py替換為實(shí)際文件名稱(chēng)
    opentelemetry-instrument python3 test.py
  5. 查看日志文件,日志樣例如下。

    2024-06-25 10:00:55,494 INFO [app] [test.py:80] [trace_id=70561de6a164ac991bfff2281b7f**** span_id=4b7f3c798460**** resource.service.name=ot-python-demo] - hello world

    說(shuō)明TraceId與SpanId已被添加到日志條目中。

調(diào)用鏈與日志服務(wù)SLS雙向關(guān)聯(lián)

在調(diào)用鏈里關(guān)聯(lián)日志

在日志服務(wù)SLS中關(guān)聯(lián)調(diào)用鏈