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

Уровни

Логгер использует нумерацию уровней OpenTelemetry — целое число в диапазоне 1..24 — для severity_number, и ровно одну из шести канонических строк для severity_text. Два поля вместе позволяют бэкендам фильтровать как по числовому диапазону, так и по точному совпадению строки.

Зачем нужны два поля

Числовое severity_number несёт детализацию (например, INFO2 = 10, INFO3 = 11); каноническое severity_text несёт bucket ("INFO"). Бэкенды вроде Grafana, Honeycomb и Datadog фильтруют по точному совпадению severity_text, поэтому значение bucket'а должно браться из фиксированного набора; иначе запрос вида severity_text = "INFO" молча пропустит записи "INFO2". Числовое поле остаётся доступным для запросов вида severity_number > 9 AND severity_number < 13.

Таблица bucket'ов

24 числовых значения отображаются на шесть канонических строк:

Диапазон severity_numberseverity_textЗначение
1-4"TRACE"Детальная диагностика
5-8"DEBUG"Отладочная информация
9-12"INFO"Информационные записи (по умолчанию INFO = 9)
13-16"WARN"Предупреждения
17-20"ERROR"Ошибки, требующие внимания
21-24"FATAL"Критические сбои уровня приложения

Базовые имена — trace, debug, info, warn, error, fatal со значениями severity_number 1, 5, 9, 13, 17, 21 соответственно. Промежуточные числа отправляются через универсальный метод log(severity_number, ...); их bucket вычисляется по таблице выше.

Вызов методов уровней

from dagstack.logger import Logger

logger = Logger.get("order_service.checkout")

logger.trace("entering function", attributes={"args.order_id": 1234})
logger.debug("cache miss", attributes={"cache.key": "user:42"})
logger.info("order placed", attributes={"order.id": 1234})
logger.warn("retry triggered", attributes={"retry.attempt": 2})
logger.error("payment declined", attributes={"order.id": 1234})
logger.fatal("config invariant violated", attributes={"reason": "missing service.name"})

Для промежуточного значения (INFO2, DEBUG3) используй универсальный метод log с явным severity_number:

logger.log(11, "intermediate level", attributes={"phase": "warmup"})
# severity_number=11 → severity_text="INFO" (по-прежнему bucket 9-12).

Константы

Каждый биндинг экспортирует границы bucket'ов как языковые константы:

from dagstack.logger import Severity

assert int(Severity.TRACE) == 1
assert int(Severity.DEBUG) == 5
assert int(Severity.INFO) == 9
assert int(Severity.WARN) == 13
assert int(Severity.ERROR) == 17
assert int(Severity.FATAL) == 21

Каждый биндинг отдаёт одни и те же шесть констант — значения совпадают с нумерацией OTel и никогда не расходятся между языками. Запланированный _meta/severity.yaml (v1.1) станет источником истины, который биндинги вендорят; v1.0-биндинги поставляют константы инлайн.

Соответствие другим системам

ИсточникTRACEDEBUGINFOWARNERRORFATAL
OTel severity_number1-45-89-1213-1617-2021-24
Python logging— (нет встроенного)1020304050
Go slog-4048
Syslog (RFC 5424)776432/1/0

Таблица соответствия будет жить в _meta/severity.yaml в spec-репозитории (v1.1; v1.0-биндинги поставляют таблицу инлайн). Полную таблицу смотри на странице Справочник по уровням.

См. также