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

Ответ

Уровни логирования — это система приоритетов для сообщений в логах. Стандартные уровни (от наиболее детального к критическому):

  1. TRACE — максимальная детализация для отладки (вход/выход из функций, значения внутренних переменных).
  2. DEBUG — информация для разработчиков о ходе выполнения (промежуточные состояния, некритические данные).
  3. INFO — регистрация нормальных событий работы приложения (сервис запущен, пользователь подключился).
  4. WARN — предупреждения о потенциальных проблемах, которые не нарушили работу (некорректный, но обработанный формат данных, медленный запрос).
  5. ERROR — ошибки, которые нарушили выполнение конкретной операции (исключение, сбой запроса к БД), но приложение продолжает работать.
  6. FATAL/CRITICAL — критические ошибки, приводящие к остановке приложения или его ключевой части.

Почему это важно? Уровни позволяют фильтровать логи. На production обычно включают INFO и выше, а на staging — DEBUG.

Пример на Python с модулем logging:

import logging

# Настройка уровня логирования для корневого логгера
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

logger.debug('Это сообщение видно только при level=DEBUG')  # Для отладки
logger.info('Пользовательский сервис инициализирован')     # Информационное событие
logger.warning('Кэш почти заполнен')                       # Предупреждение
logger.error('Не удалось подключиться к базе данных')      # Ошибка операции

Ответ 18+ 🔞

А, ну ты глянь, какие дела-то творятся! Вот сидишь ты, такой весь в себе, пишешь код, а он, сука, не работает. И ты начинаешь в консоль выводить всякую хуйню, типа print("я тут был"), print("а вот эта переменная равна", x). А потом, блядь, продакшн, и там этих принтов — овердохуища! И ты нихуя не понимаешь, что сломалось, потому что среди тонны мусора нужное сообщение найти — это как иголку в стоге сена, да ещё и сраного.

Так вот, умные дядьки придумали уровни логирования. Это, блядь, как система приоритетов для твоих всхлипов в логах. Чтоб не орать "ой, всё пропало!" на ровном месте.

Стандартная иерархия, от самого мелкого сопляка до главного паникёра:

  1. TRACE — это, блядь, полный стриптиз. Каждый чих, каждый шаг функции, каждая промежуточная переменная. Для тех случаев, когда ты реально не понимаешь, куда программа пошла и что там у неё в штанах. На продакшене это включать — самоубийство, логов будет больше, чем полезной работы.
  2. DEBUG — уже поприличнее. Инфа для разработчиков: "зашли в такой-то метод", "получили такие-то данные". Как бы "я живой, иду по плану". На тестовом стенде — самое то.
  3. INFO — нормальные, штатные события. "Сервис запущен", "Пользователь Вася залогинился". Чтоб понимать, что система в целом не сдохла и делает что надо.
  4. WARN — предупреждение, ёпта! Всё работает, но что-то идёт не так, как задумано. "Файл конфига не найден, использую значения по умолчанию", "Запрос выполнился, но оооочень медленно". Игнорируешь — скоро будет ERROR.
  5. ERROR — вот тут уже конкретная ошибка. Операция не выполнилась: "Не удалось записать в базу", "Сторонний API вернул хуйню". Приложение в целом живое, но эта конкретная фича — в ауте.
  6. FATAL/CRITICAL — пиздец, Карл! Критическая ошибка, после которой продолжать работу невозможно или бессмысленно. "Диск сломался", "Конфиг полностью невалидный". Всё, концерт окончен, пора звать админа с кофе и крепкими нервами.

А зачем этот цирк? А затем, сука, чтобы фильтровать! На продакшене ты выставляешь уровень, скажем, INFO и видишь только важные события и ошибки. А когда на стейджинге бага вылезла — включаешь DEBUG и начинаешь копаться в потрохах. Красота, а не жизнь!

Ну и, как водится, примерчик на Python, чтоб не быть голословным. Смотри, как просто:

import logging

# Настраиваем нашего логгера. Скажем ему: "Записывай всё, начиная от DEBUG!"
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)

logger.debug('Смотри-ка, переменная X = 42')  # Увидишь только если level=DEBUG
logger.info('Приложение успешно стартануло, можно работать')  # Уже INFO
logger.warning('Братан, кэш на 95% заполнен, скоро будет тесно!')  # Варнинг, внимание!
logger.error('А вот хуй тебе, а не подключение к базе!')  # Всё, ошибка, одна операция в говне

Вот и вся магия. Перестань, блядь, использовать print() для всего подряд, начни логировать с умом. А то потом сам же и будешь рыдать, разгребая эти логи, как дворник после праздника.