Перейти к основному содержимому

Поля LogRecord

Внутреннее представление строки лога. Каждый биндинг отдаёт типизированный dataclass LogRecord с полями ниже; wire-сериализация живёт в отдельных функциях (см. Форматы передачи).

Таблица полей

ПолеТипОпциональноПо умолчаниюЗаполняетсяЗначение
time_unix_nanoint (uint64)нетtime.time_ns() на emitисточник записиВременная метка emit, наносекунды от Unix epoch (OTel TimeUnixNano).
severity_numberintнетвызывающийOTel severity 1–24.
severity_textstrнетпроизводное от severity_numberбиндингОдна из шести канонических строк (TRACE, DEBUG, INFO, WARN, ERROR, FATAL).
bodyValueнетвызывающийОсновное сообщение — строка или структура (map/array/scalar).
attributesdict[str, Value]да{}вызывающий + биндингКонтекст вида ключ-значение на запись. Маскирование применяется до веерной рассылки.
instrumentation_scopeInstrumentationScope?даnullбиндингСамоописание логгера (имя, версия). Заполняется, когда используется Logger.get(name, version).
resourceResource?даnullбиндингАтрибуты процесса / сервиса / хоста. Унаследованы от root-логгера после configure(resource_attributes=...).
trace_idbytes(16)?даnullбиндингW3C Trace Context — 16 случайных байт. Заполняется из OTel-контекста, если активен span.
span_idbytes(8)?даnullбиндингW3C Trace Context — 8 случайных байт. Тот же источник, что у trace_id.
trace_flagsint (uint8)нет0биндингФлаги W3C (бит sampled и т. п.). 0 — не сэмплировано.
observed_time_unix_nanoint? (uint64)даnullприёмник (на этапе приёма)Временная метка приёма на приёмнике. Источник записи оставляет null; приёмник заполняет до wire-сериализации (по спеке §1).

Тип Value

Value — это рекурсивный sum-тип, используемый для body и значений атрибутов. Конкретная форма:

Value = str | int | float | bool | null | dict[str, Value] | list[Value]

Та же форма стоит за ConfigTree в config-spec §1; потребители могут переиспользовать один тип уровня языка, чтобы представлять и то, и другое. Значения JSON-сериализуемы (множество Value ровно совпадает с множеством JSON-значений).

InstrumentationScope

Самоописание логгера, отправившего запись:

ПолеТипЗначение
namestrИмя логгера (совпадает с аргументом Logger.get(name)).
versionstr?Семантическая версия, задаётся через Logger.get(name, version).
attributesdict[str, Value]Опциональные атрибуты уровня scope.

Для записей, отправленных плагином, scope рекомендуется выставлять равным id и version плагина из его PluginManifest (см. dagstack/plugin-system-spec).

Resource

Атрибуты уровня процесса, общие для всех логгеров в процессе:

ПолеТипЗначение
attributesdict[str, Value]Атрибуты OTel Resource — service.name, service.version, service.instance.id, deployment.environment, host.name, process.pid, telemetry.sdk.{name,version,language} и т. п.

Биндинг определяет атрибуты Resource через:

  1. Автодетект OTel (env-переменная OTEL_RESOURCE_ATTRIBUTES, OTel Resource Detectors).
  2. Явный конфиг из секции logging.resource.*.
  3. Слияние: автодетект ∪ конфиг (конфиг выигрывает).

Владение полями

По спеке §1 правила владения:

  • Вызывающий задаёт severity_number, body, опциональные attributes. Вызывающий никогда не выставляет time_unix_nano напрямую; биндинг заполняет его на emit.
  • Биндинг заполняет time_unix_nano, severity_text, instrumentation_scope, resource, trace_id, span_id, trace_flags плюс любые атрибуты, добавленные через проброс Baggage.
  • Приёмник заполняет observed_time_unix_nano, если источник записи оставил его null. Это гарантирует, что wire-вывод всегда несёт временную метку приёма.

Обзор кодирования на wire

Тот же набор полей сериализуется в три формата — каждый со своими правилами кодирования. Полную таблицу смотри на странице Форматы передачи; короткая версия:

ПолеOTLP protobufOTel JSONdagstack JSON-lines
time_unix_nanofixed64десятичная строкаint (Canonical JSON допускает int64)
trace_idbytes(16)строчные 32-hexстрочные 32-hex
span_idbytes(8)строчные 16-hexстрочные 16-hex
severity_numberintintint
severity_textstringstringstring
Регистр(бинарный)camelCasesnake_case

См. также