Skip to content

Модуль logging в Python — удобное логирование программы

Модуль logging в Python представляет собой встроенный инструмент для ведения логов. Это гибкий механизм записи сообщений (логов) в различные места, такие как файлы, консоль, потоки и т. д. Он обеспечивает структурированный способ организации информации о работе программы, что полезно при отладке, мониторинге и анализе работы приложения.
Раньше я создава логи самостоятельно в простой текстовый файл. Но с библиотекой logging логирование будет намного эффективнее, так как можно создавать файлы с разным уровнем важности информации.

Основные компоненты logging в Python

  1. Logger (Логгер): Это основной компонент модуля, представляющий собой объект, который выполняет запись сообщений. Логгеры организованы иерархически по именам, что позволяет создавать логгеры в различных частях приложения. Вы создаете логгер с помощью logging.getLogger(name).
  2. Handler (Обработчик): Обработчики определяют, куда направлять вывод логов. Например, обработчик может записывать логи в файл, консоль, отправлять по электронной почте и т. д. Вы добавляете обработчики к логгеру с помощью метода logger.addHandler(handler).
  3. Formatter (Форматировщик): Форматировщики определяют, каким образом лог-сообщения будут представлены в записях. Вы создаете форматировщики и устанавливаете их для обработчиков с помощью handler.setFormatter(formatter).
  4. Level (Уровень): Каждый лог-сообщение имеет свой уровень, который указывает на важность сообщения. Уровни включают DEBUG, INFO, WARNING, ERROR, и CRITICAL. Устанавливая уровень логгирования, вы можете контролировать, какие сообщения будут записаны.

В Python существует несколько способов ведения логов. Один из наиболее популярных и удобных способов — использование модуля logging, встроенного в стандартную библиотеку Python. Вот примеры использования:

Рассмортим самый простой пример использования библиотеки logging

Объяснения к коду:

  1. logging.basicConfig: Эта функция выполняет базовую настройку логгера. В данном примере указано имя файла лога (example.log), уровень логгирования (DEBUG — самый подробный уровень), и формат сообщений лога.
  2. logging.debug, logging.info, logging.warning, logging.error, logging.critical: Это методы для записи сообщений разных уровней в лог. Уровень логгирования можно настроить, чтобы записывать только сообщения с определенного уровня и выше. А можно записывать разные уровни в разные файлы. Об этом дальше.
  3. exc_info=True: Этот параметр добавляет информацию об исключении в лог, если произошла ошибка.

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

Logger — Настройка конфигурации логгера

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

  • filename='example.log': Этот параметр указывает имя файла, в который будут записываться логи. В данном случае, логи будут записываться в файл с именем ‘example.log’. Если вы не указываете filename, логи будут выводиться в стандартный поток вывода (консоль).
  • level=logging.DEBUG: Этот параметр устанавливает уровень логгирования. Уровень определяет, какие сообщения будут записаны. В данном случае, установлен уровень DEBUG, что означает, что будут записаны все сообщения, начиная от уровня DEBUG и выше. Вы можете выбрать из уровней логгирования, таких как DEBUG, INFO, WARNING, ERROR, и CRITICAL, в порядке увеличения уровня критичности.
  • format='%(asctime)s - %(levelname)s - %(message)s': Этот параметр определяет формат сообщений лога. В данном случае, используется формат, который включает время записи лога (%(asctime)s), уровень логгирования (%(levelname)s), и само сообщение (%(message)s). Время записи лога форматируется в соответствии с форматом времени, и это позволяет вам видеть, когда каждое сообщение было записано.
Больше статей:   Работа с файлами CSV в Python

Пример формата времени в %(asctime)s:

  • %Y: Год с веком в виде полного числа.
  • %m: Месяц как число (01-12).
  • %d: День месяца как число (01-31).
  • %H: Час (00-23).
  • %M: Минуты (00-59).
  • %S: Секунды (00-59).

Таким образом, формат '%(asctime)s - %(levelname)s - %(message)s' создает записи лога следующего вида: «2023-11-14 15:30:00 — DEBUG — This is a debug message.»

Level -уровни логирования логов.

В приведенном примере выше, строка с вызовом logging.debug("This is a debug message.") представляют собой пример отладочной информации. Содержание информации задается программистом. Данная инфоррмация запишется в логи, при уровне логирования DEBUG. Если бы уровень был установлен на более высокий, например, INFO, сообщение с уровнем DEBUG не было бы записано. Уровень логгирования можно регулировать, чтобы включить или выключить запись сообщений определенного уровня. И это очень удобно на разных этапах тестирования программы.

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

Уровни логгирования по степени критичности:

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

При установке уровня логирования записываться будут все сообщения с установленным уровня и выше. Например, если уровень установлен в DEBUG, то все сообщения с уровнем DEBUG, INFO, WARNING, ERROR, и CRITICAL будут записаны. Если уровень установлен в INFO, то будут записаны только сообщения с уровнем INFO, WARNING, ERROR, и CRITICAL, и так далее.

Файлы с разным уровнем логгирования logging в Python

В этом примере создаются два логгера: logger_info с уровнем INFO и записью в файл info.log, а также logger_debug с максимальным уровнем DEBUG и записью в файл debug.log. Вы можете использовать эти логгеры по отдельности в различных частях вашего кода в зависимости от того, какую информацию вы хотите записывать.

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

Инициализация логгера — подключение логгера к программе

Инициализация логгера обычно выполняется в основном модуле программы или в специальном модуле, который выполняет роль настройщика (configurator). Это место часто называют «точкой входа» (entry point) в ваше приложение. Инициализация логгера лучше проводить один раз, при запуске программы.

Больше статей:   Как скачать куки и хедеры с сайта в json файл для работы в программах Python

Примерно так может выглядеть структура инициализации логгера в основном файле вашей программы:

Теперь, чтобы использовать один и тот же логгер в других файлах, вам необходимо сделать следующее:

В этом примере __name__ в getLogger(__name__) будет заменено на имя текущего модуля, что гарантирует уникальность логгера в рамках вашего приложения.

Конфигуратор — отдельный файл (модуль) для настроек логгера

Конфигуратор для логгера может представлять собой отдельный модуль, который содержит функцию или класс для настройки логгера. Вот пример конфигуратора:

Теперь, в основном файле вашей программы (главном файле) вы можете использовать этот конфигуратор следующим образом:

Таким образом, конфигуратор setup_logger настраивает логгер с уровнем логгирования по умолчанию DEBUG и записью в файл ‘main.log’. Вы можете вызывать этот конфигуратор в каждом модуле, где вам необходим логгер, чтобы использовать один и тот же логгер по всему приложению.

Больше статей:   Как получить данные из Instagram с помощью Python - Парсинг Инстаграм

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

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

В этом шаблоне есть главный файл, где вызывается функция конфигурации логгера. Затем в других файлах этот логгер используется без повторной инициализации. Это создает централизованный логгер с общими настройками по всему приложению.

Такой подход помогает избежать дублирования кода и обеспечивает единообразное логгирование по всему приложению.

И напоследок мой код конфигуратора, который фильтрует сообщения INFO и ERROR и записывает их в отдельные файлы, а также выводит логи в консоль.

Leave a Reply

Your email address will not be published. Required fields are marked *