Уровни логирования
Краткая таблица для выбора уровня записи. Подробное обоснование — в главе «Логи».
Главный вопрос при выборе уровня: что должен сделать человек, прочитавший эту запись? Если ответ «немедленно что-то исправить» — это 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 | Код |
|---|---|---|
CRITICAL | Critical | 2 |
ERROR | Error | 3 |
WARNING | Warning | 4 |
INFO | Informational | 6 |
DEBUG | Debug | 7 |
Уровни Emergency (0), Alert (1) и Notice (5) в прикладных логах обычно не используются. Emergency и Alert относятся к состоянию всей системы, а не отдельного приложения.
Числовые значения в Python
В стандартном модуле logging уровни — целые числа, и фильтрация работает по принципу «не ниже заданного»:
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) # подробнее для одного модуляУровень можно задавать для отдельных логгеров иерархии. Это позволяет временно включить подробный вывод для одного модуля, не заливая логи сообщениями со всей системы.