О логах

Многие программисты используют print для лечения багов, но в больших, серьёзных проектах так не получится:

  • Во-первых, они обычно запущены на сервере, из-за чего до вывода print будет не добраться. А если программу перезапустить, то все сообщения пропадут и вовсе.
  • Во-вторых, чтобы сообщения были полезны, нужно выводить много всего: время, строку в коде, что случилось... Это всё очень засорит код ненужным мусором.

Просто не выводить такие сообщения — тоже плохо. Представьте, вы написали программу, запустили на сервере. Через год вам пишут, что ваша программа сломалась. И что же делать, где ошибка?

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

  • Можно сортировать по степени важности, времени и т. д.
  • Можно выводить не только в терминал. За вас уже реализован вывод в файл, например.
  • Легко понять где, когда и что произошло.

Как пользоваться

Для ведения логов в Python есть библиотека logging:

import logging

logging.debug('Сообщение для дебагинга')
logging.info('Произошло какое-то событие. Всё идёт по плану.')
logging.warning('Предупреждение, что-то могло сломаться')
logging.error('Ошибка, что-то сломалось')
logging.critical('МЫ В ОГНЕ ЧТО ДЕЛАТЬ?!?!')

Здесь мы создаём записи в логах на разных уровнях важности (от debug до critical). При таком использовании будет выглядеть почти как принты:

WARNING:root:Предупреждение, что-то могло сломаться
ERROR:root:Ошибка, что-то сломалось
CRITICAL:root:МЫ В ОГНЕ ЧТО ДЕЛАТЬ?!?!

Вопрос, куда делись первые 2 сообщения? Дело в том, что logging автоматически фильтрует для вас логи по степени важности:

  1. DEBUG — сообщения для отладки, которые вы оставили для себя. Содержимое переменных и всё такое. Самые не важные.
  2. INFO — сообщения о происходящих событиях (отправлено письмо, зарегестрирован новый пользователь).
  3. WARNING — предупреждения, например: Файл настроек не найден, использую стандартные.
  4. ERROR — ошибки, которые не ломают программу. Например, если чат-бот не может ответить одному из пользователей из-за ошибки, он может его проигнорировать и общаться с остальными.
  5. CRITICAL — критические ошибки, из-за которых программа работать дальше не может. самые важные.

По умолчанию logging фиксирует только логи уровня WARNING и выше (т.е. ещё ERROR и CRITICAL), а все логи уровнями ниже — игнорирует (DEBUG и INFO). Это можно изменить в настройках логов:

import logging

logging.basicConfig(level=logging.DEBUG)
logging.debug('Сообщение уровня DEBUG')

Теперь вы увидите все логи, на всех уровнях.

Что читать дальше?

Обращайтесь к нашим статьям:

К статьям с других сайтов:

Или к документации logging