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

Поля LogRecord

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

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

ПолеТипОпциональноПо умолчаниюЗаполняетсяЗначение
time_unix_nanoint (uint64)нетtime.time_ns() на emitproducerTimestamp 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]да{}вызывающий + биндингPer-record key-value контекст. Маскирование применяется до fan-out.
instrumentation_scopeInstrumentationScope?даnullбиндингSelf-descriptor логгера (имя, версия). Заполняется, когда используется 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приёмник (на ingest)Timestamp ingest на приёмнике. Producer оставляет null; приёмник заполняет до wire-сериализации (по спеке §1).

Тип Value

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

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

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

InstrumentationScope

Self-descriptor логгера, отправившего запись:

ПолеТипЗначение
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. Autodetect OTel (env-переменная OTEL_RESOURCE_ATTRIBUTES, OTel Resource Detectors).
  2. Явный конфиг из секции logging.resource.*.
  3. Слияние: env-detected ∪ config-supplied (config выигрывает).

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

По спеке §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, если producer оставил его null. Это гарантирует, что wire-вывод всегда несёт ingest-timestamp.

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

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

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

См. также