Корреляция логов приложения с trace
Когда OpenTelemetry Java agent инструментаризует ваше приложение, он может автоматически добавлять активный контекст trace — trace_id, span_id и trace_flags — в контекст логирования вашего приложения (MDC). Выводя эти значения в логах, вы можете напрямую перейти от строки лога к соответствующему trace, а затем — от trace обратно к логам, которые сгенерировал запрос.
На этой странице объясняется, как вывести контекст trace в логах для приложений Java.
Предварительное требование: это руководство предполагает, что ваше приложение уже инструментаризовано OpenTelemetry Java agent 2.x, внедренным через пользовательский ресурс Instrumentation и аннотацию instrumentation.opentelemetry.io/inject-java. Ключи MDC, описанные ниже, заполняются агентом во время выполнения — если агент не внедрен, эти ключи будут пустыми независимо от того, как вы настроите шаблон логов. Сначала см. Java Auto-instrumentation, чтобы включить внедрение.
Содержание
Как это работаетВывод ID в логахSpring BootLogbackLog4j 2Ключи OpenTelemetry agent против встроенной корреляции Spring Boot / MicrometerЭкспорт логов через OTLPДругие языкиСсылкиКак это работает
Java agent поставляется с инструментированием логирования, которое копирует текущий контекст span в MDC (Mapped Diagnostic Context) вашей библиотеки логирования. Вам не нужно разбирать HTTP-заголовки или писать какой-либо код для этого — агент извлекает контекст из заголовков распространения и автоматически заполняет MDC. Внедряемые ключи:
Эти ключи используют формат snake_case и являются встроенными значениями агента по умолчанию. Внедрение включено по умолчанию, поэтому все, что вам нужно сделать, — сослаться на эти ключи в шаблоне вывода логов.
Инструментирование соответствует вашей библиотеке логирования:
Если вам когда-либо понадобится отключить конкретное внедрение (или снова включить его), задайте соответствующее свойство или переменную среды для workload. По умолчанию каждый из этих параметров имеет значение true:
Вывод ID в логах
Выберите вариант, который соответствует конфигурации вашего приложения. Все три варианта используют одни и те же ключи MDC в формате snake_case, поэтому для запроса с выборкой в логах появится строка, например:
Spring Boot
Для приложения Spring Boot самый простой способ — переопределить logging.pattern.level, чтобы ID добавлялись в начало каждой строки лога без переписывания всего шаблона:
Это точная форма, задокументированная в upstream README для инструментирования OpenTelemetry (см. Ссылки). Переопределение logging.pattern.level — это соглашение Spring Boot; ключи snake_case предоставляет агент.
Logback
Если вы управляете собственным logback.xml или logback-spring.xml, ссылайтесь на ключи через %X{...} (что в Logback эквивалентно %mdc{...}) внутри шаблона:
Для приложений, которые используют стандартный консольный appender Spring Boot, вместо этого можно переопределить свойство CONSOLE_LOG_PATTERN, внедрив в шаблон те же токены %X{trace_id}.
Log4j 2
Для Log4j 2 ссылайтесь на ключи через %X{...} в PatternLayout:
Ключи OpenTelemetry agent против встроенной корреляции Spring Boot / Micrometer
Ключи 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), но имена внедряемых полей и способ их включения различаются в зависимости от языка. Обратитесь к рекомендациям для используемого языка:
Go намеренно не включен: для него нет runtime agent, а его auto-instrumentation на основе eBPF не внедряет контекст trace в логи приложения. Корреляция логов с trace в Go выполняется вручную в коде — например, чтением контекста span из context.Context или через мост otelslog — поэтому здесь нет zero-code ссылки, на которую можно было бы сослаться.
Ссылки
- Автоинструментирование Logger MDC — авторитетный список внедряемых ключей и поддерживаемых библиотек логирования.
- README по инструментированию Logback MDC — примеры шаблонов и параметры конфигурации.
- Конфигурация Java agent и отключение конкретного инструментирования — как включать и отключать отдельные инструментирования.