devnoize справочник

Уровни логирования

Краткая таблица для выбора уровня записи. Подробное обоснование — в главе «Логи».

Главный вопрос при выборе уровня: что должен сделать человек, прочитавший эту запись? Если ответ «немедленно что-то исправить» — это ERROR или CRITICAL. Если «обратить внимание, если таких записей станет много» — WARNING. Если «ничего, но полезно знать при разборе» — INFO. Если запись нужна только автору кода — DEBUG.

УровеньКогда применятьПример сообщенияРеакцияПо умолчанию в рабочем окружении
CRITICALСервис не может продолжать работу или теряет данные.cannot open write-ahead log, shutting downНемедленная, обычно сопровождается алертом.Включён
ERRORОперация не выполнена по вине сервиса или его зависимости; нужна проверка человеком.failed to persist order after 3 attemptsРазбор в рабочее время; рост частоты — алерт.Включён
WARNINGОперация выполнена, но в нештатных условиях: повтор, резервный путь, значение по умолчанию.primary cache unavailable, using fallbackНе требуется для одиночной записи; тренд смотрят на дашборде.Включён
INFOЗначимые события жизненного цикла и бизнес-события, нужные при разборе.config reloaded, 14 routes activeНе требуется.Включён
DEBUGПодробности внутренней логики, значения промежуточных переменных.cache key computed: orders:v2:99312Не требуется.Выключен

Что не является ошибкой

Записи ниже часто ошибочно пишут с уровнем ERROR. Правильный уровень — INFO или WARNING, в зависимости от того, важен ли рост их числа.

СитуацияУровеньПочему
Пользователь ввёл неверный парольINFOНормальная работа. Для обнаружения подбора паролей нужна метрика, а не уровень лога.
Запрос с некорректными данными отклонён валидациейINFOСервис сработал как задумано. Ошибка на стороне клиента.
Внешний API вернул 404 на запрос несуществующего объектаINFOОжидаемый ответ, если отсутствие объекта предусмотрено логикой.
Повторный запрос к зависимости прошёл успешноWARNINGОперация выполнена, но рост числа повторов — ранний признак проблемы.
Клиент закрыл соединение до получения ответаINFOНе зависит от сервиса. При массовом характере смотрят на задержки.
Истёк срок действия токена сессииINFOШтатный сценарий, который обрабатывается повторным входом.

Соответствие уровням syslog

Если логи передаются по протоколу syslog, уровни приложения нужно сопоставить с восемью уровнями важности из RFC 5424. Распространённое соответствие:

Уровень приложенияSyslog severityКод
CRITICALCritical2
ERRORError3
WARNINGWarning4
INFOInformational6
DEBUGDebug7

Уровни Emergency (0), Alert (1) и Notice (5) в прикладных логах обычно не используются. Emergency и Alert относятся к состоянию всей системы, а не отдельного приложения.

Числовые значения в Python

В стандартном модуле logging уровни — целые числа, и фильтрация работает по принципу «не ниже заданного»:

python
import logging

print(logging.DEBUG, logging.INFO, logging.WARNING, logging.ERROR, logging.CRITICAL)
# 10 20 30 40 50

logging.getLogger("payments").setLevel(logging.WARNING)   # только WARNING и выше
logging.getLogger("payments.retry").setLevel(logging.INFO)  # подробнее для одного модуля

Уровень можно задавать для отдельных логгеров иерархии. Это позволяет временно включить подробный вывод для одного модуля, не заливая логи сообщениями со всей системы.