Какие основные уровни серьезности (severity levels) используются в логировании?

«Какие основные уровни серьезности (severity levels) используются в логировании?» — вопрос из категории Логирование и мониторинг, который задают на 10% собеседований QA Тестировщик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Стандартные уровни логирования, упорядоченные по возрастанию серьезности:

Уровень Назначение Когда использовать Пример сообщения
DEBUG Детальная информация для отладки. Для диагностики проблем в разработке. "User ID 123 retrieved from cache. Cache hit: true."
INFO Подтверждение нормальной работы приложения. Для отслеживания ключевых событий бизнес-логики. "Order #4567 successfully placed by user ID 123."
WARNING Потенциально вредная или неожиданная ситуация. Когда что-то пошло не так, но приложение работает. "Database connection pool is 90% full."
ERROR Серьезная ошибка, из-за которой операция не выполнена. Когда функция не смогла выполниться (но приложение живо). "Failed to process payment for order #4567. Payment gateway timeout."
CRITICAL / FATAL Критическая ошибка, требующая немедленного вмешательства. Когда приложение не может продолжать работу. "Database is unreachable. Application shutting down."

Почему уровни важны:

  • Фильтрация: В production обычно включают логи от WARNING и выше, чтобы не перегружать системы.
  • Мониторинг и алертинг: Системы мониторинга (Prometheus, Grafana) могут отслеживать количество ошибок (ERROR, CRITICAL) и генерировать алерты.

Пример настройки в Python (logging module):

import logging

# Настройка формата и уровня
logging.basicConfig(
    level=logging.WARNING,  # Будут логироваться события WARNING и выше
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

logger = logging.getLogger(__name__)

# Примеры логов
logger.debug("Это сообщение не будет выведено в production.")
logger.info("Запуск обработки задачи.")
logger.warning("Конфигурационный файл не найден, используются значения по умолчанию.")
logger.error("Не удалось подключиться к внешнему API.")
logger.critical("Диск переполнен!")