Найти в Дзене
Computer Pro

Логгирование в Python. Модуль logging. Примеры в задачах. Часть 1

Logging в Python это стандартная библиотека, используемая для протоколирования событий, происходящих в тех или иных компонентах программы. В данной статье будут лишь примеры выполнения некоторых задач из курса python_basic, одной известной образовательной интернет-платформы. Официальная документация к данному модулю. Задачи 1 и 2. Добавляем логирование, ООП-конфигурация У нас есть некая программа (консольный калькулятор двух чисел), в котором нет логирования, есть вместо этого принты. Принты нужно заменить соответствующими логами (это условия первой задачи). Вторая задача нам предписывает выполнить следующее: Добавьте в приложение выше функцию, которая будет конфигурировать логирование с помощью basicConfig. Обработчик должен выводить логи в стандартный поток вывода (stdout). Также добавьте форматирование с помощью класса Formatter ко всем обработчикам в таком виде: уровень | логгер | время | номер строки | сообщение Начальная версия программы: Убираем все принты из данной программы и
Оглавление

Logging в Python это стандартная библиотека, используемая для протоколирования событий, происходящих в тех или иных компонентах программы.

В данной статье будут лишь примеры выполнения некоторых задач из курса python_basic, одной известной образовательной интернет-платформы.

Официальная документация к данному модулю.

Задачи 1 и 2. Добавляем логирование, ООП-конфигурация

У нас есть некая программа (консольный калькулятор двух чисел), в котором нет логирования, есть вместо этого принты. Принты нужно заменить соответствующими логами (это условия первой задачи).

Вторая задача нам предписывает выполнить следующее:

Добавьте в приложение выше функцию, которая будет конфигурировать логирование с помощью basicConfig. Обработчик должен выводить логи в стандартный поток вывода (stdout).

Также добавьте форматирование с помощью класса Formatter ко всем обработчикам в таком виде:

уровень | логгер | время | номер строки | сообщение

Начальная версия программы:

-2
-3

Убираем все принты из данной программы и заменяем их логгированием. Каждый модуль логгирования имеет соответствующее имя. Созданный обработчик выводит логи в stdout, а не в stderr. Форматирование происходит с помощью класса Formatter. У меня получилось как-то так:

-4
-5
-6

У меня получился вот такой вывод в консоль:

-7

Если допустит ошибку вместо цифр, допустим, поставить букву, или вместо арифметического знака (+ - / *) будет что-то не то, сработает исключение и ошибка.

-8
-9

Возможно обработку ошибок я сделал неправильно. Но я не очень понимаю из условий задачи - как правильно... Так что пусть пока останется все как есть и идём дальше.

Задача 3. Многоуровневый обработчик

Добавьте handler, который будет писать сообщения разных уровней в соответствующие файлы. Например, сообщения уровня debug попадут в файл calc_debug.log, а уровня error — в calc_error.log.

За основу берутся логи и код из предыдущих двух задач... С одним лишь отличием - подключить нового обработчика. Логи должны попасть в соответствующие файлы, а не в консоль.

ЗЫ.Судя по именам calc_debug.log и calc_error.log, в предыдущем пункте я неверно установил уровень логгирования, нужно было - DEBUG, а я сделал INFO. Собственно и не удивительно, ведь в условиях задачи было туманное определение "добавьте вместо вызова print логгирование с подходящим по смыслу уровнем". Мне показалось что уровень INFO будет - то что надо... Я ошибся))) Придется подправить предыдущую задачу...

Нам дается вот такой шаблон программы:

-10

Данную задачу можно решить тем же методом что и было описано в видео, в четвертом уроке - "про CustomHandlers":

-11

Данный код, можно вставить практически без изменений в наш класс LevelFileHandler(logging.Handler), за одним лишь исключением - добавим проверку по уровню логгирования, в соответствии с этим и будем назначать имя файла, в который будет сохраняться лог:

-12

Ну и по тому же принципу чуть ниже сделаем словарь с настройками:

-13
-14

Осталось только прописать логгеры в файлах app.py и utils.py:

-15
-16

Если ошибок нет, числа и операторы записаны правильно, логи пойдут в файл calc_debug.log:

-17

Если возникла ошибка и вместо числа или нужного нам арифметического знака затесался какой-то другой символ - будет ошибка и запись в calc_error.log:

-18

Хотел было уже пойти дальше, но потом подумал - а зачем я использовал dict-конфигурацию? Когда это всё можно было сделать в рамках basicConfig. И как результат, я переработал программу вот в такой вид:

-19

Обожаю когда получается строк кода, меньше чем было! И работает всё так же! А вот ниже уже можно сделать dict-конфигурацию, о чем собственно и гласит следующее задание.

Хотел было в одной статье всё изложить, да слишком много для одной статьи материала получается. Значит буду делить на части. Ну, в общем, конец 1 части...