Мы продолжаем писать робота, который собирает госконтракты и отправляет выборку на почту. Из прошлого выпуска вы узнали, как на этапе написания программы получить сообщение о том, что что-то в нашем коде пошло не так. Но давайте представим ситуацию, когда наш робот уже дописан и каждую неделю присылает нам на почту письмо с собранными контрактами. И вдруг в положенный день письмо не приходит – что-то сломалось. При этом, мы не можем круглосуточно дежурить у компьютера и следить за тем, как выполняется код и в каком месте возникла ошибка. В таких случаях спасает логирование.

Видео: Глеб Лиманский

Логирование похоже на запись хода выполнения программы в журнал. Информация из него будет полезна для понимания того, что происходило с программой, когда нас не было рядом, и исправления проблем. Сегодня мы создадим такой лог-файл для нашего робота, но для начала рассмотрим принцип работы логирования на простом примере. Для этого создам чистый файл – logs.py. Импортируем библиотеку logging. Потом создадим простую конструкцию: напишем, что мы хотим сохранить логи в файл, дадим ему название и установим уровень логирования.

Есть несколько уровней логирования, здесь они перечислены в порядке возрастания значимости. Обычно чем больше информации в логах, тем легче понять, что случилось, но когда ее слишком много, разобраться бывает сложно. Поэтому придуманы разные уровни логирования в зависимости от того, насколько значимую информацию мы хотим сохранять. По умолчанию этот уровень WARNING – то есть в логах будут отображаться все сообщения этого уровня и выше (WARNING, ERROR, CRITICAL). Но его можно поменять, указав нужный в параметре level – давайте установим DEBUG – тогда будет записываться информация всех уровней. 

  • DEBUG – подробное и детальное логирование всей системной информации для последующего использования в отладке;
  • INFO – подтверждение, информация о событиях, не приводящих к ошибкам в работе модулей;
  • WARNING – информация о событиях, которые могут привести к ошибкам в работе модулей;
  • ERROR – информация об ошибках, возникших в работе модулей;
  • CRITICAL – информация о критических ошибках, возникших в работе модулей.

После этого для примера напишем простой код с делением на 0: попробуй разделить 10 на 0, а если не получится, если возникнет какая-то ошибка, выведи нам в файл сообщение об этой ошибке.

Выполним этот код, и теперь у нас на компьютере появился простой файл, в котором содержится следующая информация: уровень сообщения (ERROR) и суть этой ошибки (деление на 0).

Если мы хотим увидеть подробности, можно вместо error написать exception. Вот как в этом случае изменится информация в лог-файле.

Код
Код
Лог-файл
Лог-файл

Регистрировать можно не только ошибки, но и удачные сценарии. Давайте разделим 10 на 10 и попросим напечатать в лог-файл результат. В этом случае мы используем не error или exception, а info. Устанавливать эти уровни в коде важно, чтобы потом не запутаться, в каком случаем это была ошибка, в каком просто информация.

Код
Код
Лог-файл
Лог-файл

Перейдем к коду, который создает робота. Мы снова импортируем библиотеку logging и создаем файл с логами. Дадим ему имя, установим уровень DEBUG и отформатируем сообщение, которое будет выведено в логах. В примере, который я показывала, мы видели в лог-файле минимум информации. Теперь мы хотим сделать эту информацию более читаемой. Это делается с помощью format. В нем мы прописываем параметры, которые хотим видеть в сообщении: например время, когда действие выполнилось, уровень сообщения, название функции, которая выполняется в этот момент, и наше сообщение. Весь список этих атрибутов можно увидеть в документации библиотеки logging.

Дальше мы должны подумать, в какой части кода могут возникнуть ошибки. Давайте оставим нетронутыми наши вспомогательные функции, в которых вряд ли возникнут какие-то ошибки и перейдем к месту, где в теории может что-то сломаться – это наша главная функция get_contracts. Пропишем внутри нее информационное сообщение о том, что выполнение этой функции началось, а в части try – except попросим вывести в случае ошибки сообщение об этой ошибке. При удачном сценарии в лог-файле мы увидим следующую информацию:

Код
Код
Лог-файл
Лог-файл

Давайте проверим, что будет, если подключиться не удастся, например, в случае отключения интернета. Тогда в лог-файле мы увидим, какая конкретно ошибка возникла: 

Отрывок информации из лог-файла в случае проблем с соединением
Отрывок информации из лог-файла в случае проблем с соединением

По такому же принципу добавим логирование и в остальные части кода. Какая информация отобразится в логах при удачных и неудачных сценариях в этих случаях – смотрите в видео-версии этого урока.

Теперь вы знаете принцип логирования выполнения программы в файл, дальше вы можете настроить его под себя и свои потребности, упростить или усложнить. Подробнее про библиотеку logging читайте в официальной документации