• Русский
  • Корреляция логов приложения с trace

    Когда OpenTelemetry Java agent инструментаризует ваше приложение, он может автоматически добавлять активный контекст trace — trace_id, span_id и trace_flags — в контекст логирования вашего приложения (MDC). Выводя эти значения в логах, вы можете напрямую перейти от строки лога к соответствующему trace, а затем — от trace обратно к логам, которые сгенерировал запрос.

    На этой странице объясняется, как вывести контекст trace в логах для приложений Java.

    WARNING

    Предварительное требование: это руководство предполагает, что ваше приложение уже инструментаризовано OpenTelemetry Java agent 2.x, внедренным через пользовательский ресурс Instrumentation и аннотацию instrumentation.opentelemetry.io/inject-java. Ключи MDC, описанные ниже, заполняются агентом во время выполнения — если агент не внедрен, эти ключи будут пустыми независимо от того, как вы настроите шаблон логов. Сначала см. Java Auto-instrumentation, чтобы включить внедрение.

    Как это работает

    Java agent поставляется с инструментированием логирования, которое копирует текущий контекст span в MDC (Mapped Diagnostic Context) вашей библиотеки логирования. Вам не нужно разбирать HTTP-заголовки или писать какой-либо код для этого — агент извлекает контекст из заголовков распространения и автоматически заполняет MDC. Внедряемые ключи:

    КлючОписание
    trace_id32-символьный trace ID активного span.
    span_id16-символьный span ID активного span.
    trace_flagsФлаги trace W3C в шестнадцатеричном формате (например, 01, если span выбран для сбора).

    Эти ключи используют формат snake_case и являются встроенными значениями агента по умолчанию. Внедрение включено по умолчанию, поэтому все, что вам нужно сделать, — сослаться на эти ключи в шаблоне вывода логов.

    Инструментирование соответствует вашей библиотеке логирования:

    Библиотека логированияМодуль инструментированияМинимальная версия
    Logbacklogback-mdc-1.01.0+
    Log4j 2log4j-context-data-2.172.7+
    Log4j 1log4j-mdc-1.21.2+

    Если вам когда-либо понадобится отключить конкретное внедрение (или снова включить его), задайте соответствующее свойство или переменную среды для workload. По умолчанию каждый из этих параметров имеет значение true:

    Системное свойствоПеременная среды
    otel.instrumentation.logback-mdc.enabledOTEL_INSTRUMENTATION_LOGBACK_MDC_ENABLED
    otel.instrumentation.log4j-context-data.enabledOTEL_INSTRUMENTATION_LOG4J_CONTEXT_DATA_ENABLED
    otel.instrumentation.log4j-mdc.enabledOTEL_INSTRUMENTATION_LOG4J_MDC_ENABLED

    Вывод ID в логах

    Выберите вариант, который соответствует конфигурации вашего приложения. Все три варианта используют одни и те же ключи MDC в формате snake_case, поэтому для запроса с выборкой в логах появится строка, например:

    2026-06-12 10:15:42.123 trace_id=4bf92f3577b34da6a3ce929d0e0e4736 span_id=00f067aa0ba902b7 trace_flags=01 INFO  ProviderController - request /hello

    Spring Boot

    Для приложения Spring Boot самый простой способ — переопределить logging.pattern.level, чтобы ID добавлялись в начало каждой строки лога без переписывания всего шаблона:

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

    Это точная форма, задокументированная в upstream README для инструментирования OpenTelemetry (см. Ссылки). Переопределение logging.pattern.level — это соглашение Spring Boot; ключи snake_case предоставляет агент.

    Logback

    Если вы управляете собственным logback.xml или logback-spring.xml, ссылайтесь на ключи через %X{...} (что в Logback эквивалентно %mdc{...}) внутри шаблона:

    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
        <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %-5level %logger{36} - %msg%n</pattern>
      </encoder>
    </appender>

    Для приложений, которые используют стандартный консольный appender Spring Boot, вместо этого можно переопределить свойство CONSOLE_LOG_PATTERN, внедрив в шаблон те же токены %X{trace_id}.

    Log4j 2

    Для Log4j 2 ссылайтесь на ключи через %X{...} в PatternLayout:

    <Console name="Console" target="SYSTEM_OUT">
      <PatternLayout
        pattern="%d{yyyy-MM-dd HH:mm:ss.SSS} trace_id=%X{trace_id} span_id=%X{span_id} trace_flags=%X{trace_flags} %-5p %c{1} - %m%n"/>
    </Console>

    Ключи OpenTelemetry agent против встроенной корреляции Spring Boot / Micrometer

    WARNING

    Ключи snake_case (trace_id, span_id, trace_flags) применяются, когда источником контекста trace является OpenTelemetry Java agent — именно на это рассчитана вся эта документация.

    Spring Boot 3 с Micrometer Tracing имеет собственную, отдельную функцию корреляции логов, которая использует ключи в формате camelCase (traceId, spanId) через logging.pattern.correlation. Это другой механизм, не связанный с агентом.

    Используйте ключи, которые соответствуют источнику вашего trace. Если вы укажете %X{traceId}, а контекст предоставляет агент (а не Micrometer), поле будет пустым — и аналогично %X{trace_id} будет пустым, если активен только Micrometer. Не смешивайте эти два соглашения.

    Экспорт логов через OTLP

    Приведенные выше шаблоны предназначены для текстовых логов (консоль или файл), которые читаются или собираются как текст. Если же вы экспортируете логи напрямую через OTLP, trace_id и span_id передаются в выделенных полях записи лога OTLP, а не как атрибуты MDC, поэтому экспортированные через OTLP логи остаются коррелированными без добавления ID в шаблон лога.

    Другие языки

    Другие языки OpenTelemetry также связывают логи с trace в режиме zero-code (auto-instrumentation), но имена внедряемых полей и способ их включения различаются в зависимости от языка. Обратитесь к рекомендациям для используемого языка:

    ЯзыкСсылкаКак работает корреляция
    PythonПример auto-instrumentation для логовopentelemetry-instrument добавляет otelTraceID / otelSpanID в записи логов; установите OTEL_PYTHON_LOG_CORRELATION=true, чтобы внедрить их в текстовый вывод логов.
    Node.jsinstrumentation-pino, instrumentation-winston, instrumentation-bunyanВходит в @opentelemetry/auto-instrumentations-node; каждый по умолчанию внедряет trace_id / span_id / trace_flags в записи логов.
    .NETКорреляция логов с trace.NET Automatic Instrumentation автоматически заполняет TraceId / SpanId / TraceState в записях ILogger без какой-либо настройки.
    NOTE

    Go намеренно не включен: для него нет runtime agent, а его auto-instrumentation на основе eBPF не внедряет контекст trace в логи приложения. Корреляция логов с trace в Go выполняется вручную в коде — например, чтением контекста span из context.Context или через мост otelslog — поэтому здесь нет zero-code ссылки, на которую можно было бы сослаться.

    Ссылки