Ответ
Уровни логирования — это система приоритетов для сообщений в логах. Стандартные уровни (от наиболее детального к критическому):
- TRACE — максимальная детализация для отладки (вход/выход из функций, значения внутренних переменных).
- DEBUG — информация для разработчиков о ходе выполнения (промежуточные состояния, некритические данные).
- INFO — регистрация нормальных событий работы приложения (сервис запущен, пользователь подключился).
- WARN — предупреждения о потенциальных проблемах, которые не нарушили работу (некорректный, но обработанный формат данных, медленный запрос).
- ERROR — ошибки, которые нарушили выполнение конкретной операции (исключение, сбой запроса к БД), но приложение продолжает работать.
- 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). А потом, блядь, продакшн, и там этих принтов — овердохуища! И ты нихуя не понимаешь, что сломалось, потому что среди тонны мусора нужное сообщение найти — это как иголку в стоге сена, да ещё и сраного.
Так вот, умные дядьки придумали уровни логирования. Это, блядь, как система приоритетов для твоих всхлипов в логах. Чтоб не орать "ой, всё пропало!" на ровном месте.
Стандартная иерархия, от самого мелкого сопляка до главного паникёра:
- TRACE — это, блядь, полный стриптиз. Каждый чих, каждый шаг функции, каждая промежуточная переменная. Для тех случаев, когда ты реально не понимаешь, куда программа пошла и что там у неё в штанах. На продакшене это включать — самоубийство, логов будет больше, чем полезной работы.
- DEBUG — уже поприличнее. Инфа для разработчиков: "зашли в такой-то метод", "получили такие-то данные". Как бы "я живой, иду по плану". На тестовом стенде — самое то.
- INFO — нормальные, штатные события. "Сервис запущен", "Пользователь Вася залогинился". Чтоб понимать, что система в целом не сдохла и делает что надо.
- WARN — предупреждение, ёпта! Всё работает, но что-то идёт не так, как задумано. "Файл конфига не найден, использую значения по умолчанию", "Запрос выполнился, но оооочень медленно". Игнорируешь — скоро будет
ERROR. - ERROR — вот тут уже конкретная ошибка. Операция не выполнилась: "Не удалось записать в базу", "Сторонний API вернул хуйню". Приложение в целом живое, но эта конкретная фича — в ауте.
- 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() для всего подряд, начни логировать с умом. А то потом сам же и будешь рыдать, разгребая эти логи, как дворник после праздника.