Как настроить стандартную библиотеку логирования `logging` в Python?

Ответ

Стандартная библиотека logging в Python — это мощный и гибкий инструмент для управления логами приложения. Она позволяет настраивать уровни логирования, форматы сообщений, обработчики (handlers) и фильтры.

Почему это важно: Правильное логирование критически важно для отладки, мониторинга и анализа поведения приложения в различных средах, помогая быстро выявлять и устранять проблемы.

Базовая настройка: Для быстрой настройки можно использовать logging.basicConfig(), который конфигурирует корневой логгер.

import logging

# Базовая настройка логирования
logging.basicConfig(
    level=logging.INFO,  # Уровень логирования (DEBUG, INFO, WARNING, ERROR, CRITICAL)
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # Формат сообщения
    handlers=[
        logging.FileHandler('app.log', encoding='utf-8'), # Запись в файл
        logging.StreamHandler() # Вывод в консоль
    ]
)

logger = logging.getLogger(__name__) # Получение логгера для текущего модуля
logger.info("Это информационное сообщение.")
logger.warning("Это предупреждение.")

Расширенные возможности:

  • Множественные логгеры: Создание отдельных логгеров для разных модулей или компонентов с индивидуальными настройками.
  • Ротация логов: Использование RotatingFileHandler или TimedRotatingFileHandler для автоматической ротации лог-файлов по размеру или времени.
  • Фильтры: Добавление кастомных фильтров для выборочной обработки лог-записей.
  • Кастомные обработчики: Интеграция с внешними системами мониторинга (например, Sentry, ELK Stack) через специализированные обработчики.

Рекомендации: Всегда выбирайте адекватные уровни логирования. Избегайте избыточного логирования DEBUG уровня в продакшене, чтобы не перегружать систему и не раскрывать конфиденциальные данные.

Ответ 18+ 🔞

Да ты посмотри, что за зверь этот logging в Python, а? Это ж не просто хуй собачий какой-то print(), который набросал и забыл. Это целая ебучка, чтобы твоё приложение не превратилось в чёрный ящик, из которого только и светится, что "Something went wrong, lol".

А нахуя оно вообще надо? Представь, твоя прога в продакшене накрылась медным тазом. А ты сидишь и гадаешь: "Ну что, блядь, случилось-то?". А если бы ты настроил логирование, как человек, ты бы уже видел, где конкретно эта мартышлюшка споткнулась. Отладка, мониторинг, анализ — без логов ты просто слепой кот в тёмной комнате.

Самый простой способ, чтоб не ебаться: Есть функция basicConfig(). Она для тех, кто не хочет заморачиваться, но хочет уже хоть что-то.

import logging

# Вот так, внатуре, быстро и сердито
logging.basicConfig(
    level=logging.INFO,  # Ловить всё от INFO и выше. DEBUG в продакшене — это пиздец, а не логи.
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # Чтоб красиво было, а не абракадабра
    handlers=[
        logging.FileHandler('app.log', encoding='utf-8'), # Пишем в файлик
        logging.StreamHandler() # И дублируем в консоль, для пафоса
    ]
)

logger = logging.getLogger(__name__) # Берём логгер для этого модуля
logger.info("Приложение стартануло, ура.")
logger.warning("А тут что-то подозрительно, насторожи жопу.")

А если хочется поизвращаться? О, тут просто овердохуища возможностей открывается!

  • Куча логгеров: Можно наделать отдельных логгеров для каждой части приложения. Чтоб логи от базы данных не мешались с логикой от расчёта кредита.
  • Ротация, блядь: Представляешь, лог-файл на 500 гигов? RotatingFileHandler или TimedRotatingFileHandler — твои лучшие друзья. Они сами порежут файлы по размеру или времени.
  • Фильтры: Хочешь, чтобы в лог не попадали сообщения от какого-нибудь надоедливого модуля? Фильтр ему в сраку!
  • Отправка куда угодно: В Sentry, в ELK, в телеграм-боту, в мозг админу — пиши свой обработчик и впердоливай логи куда душе угодно.

Главный совет, чтоб не обосраться: Не логгируй всё подряд на уровне DEBUG в продакшене. Это как кричать "ЁБАНО!" на каждом шагу — скоро все перестанут обращать внимание, а диск забьётся хуй пойми чем. Да и пароли/токены случайно в лог не выведи, а то будет волнение ебать.