Модуль logging Python

В программировании логирование — очень важный инструмент. Оно помогает отслеживать состояние работы программ, отлаживать ошибки и записывать важную информацию.

Python предоставляет встроенныйloggingмодуль, специально предназначенный для задач логирования. По сравнению с простымиprintинструкциями,loggingмодуль более гибкий и мощный, способен удовлетворять потребности логирования в различных сценариях.

Зачем использовать модуль logging?

  1. Гибкость:loggingМодуль позволяет при необходимости задавать уровни логирования, форматы и назначения вывода.
  2. Масштабируемость: Вы можете легко выводить логи в различные назначения, такие как файлы, консоль, сеть и т. д.
  3. Структурированное логирование:loggingМодуль поддерживает структурированное логирование, что удобно для последующего анализа и обработки.
  4. Оптимизация производительности: По сравнению сprint,loggingмодуль оптимизирован по производительности и подходит для использования в производственных средах.

Базовое использование модуля logging

1. Импорт модуля logging

Сначала нам нужно импортироватьloggingмодуль:

Пример

import logging

2. Настройте уровень логирования

Уровень логирования используется для управления подробностью логов.loggingМодуль предоставляет следующие уровни логирования:

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

Уровень логирования можно задать с помощью следующего кода:

Пример

logging.basicConfig(level=logging.DEBUG)

3. Запись логов

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

Пример

logging.debug("Это отладочное сообщение")
logging.info("Это общее сообщение")
logging.warning("Это предупреждающее сообщение")
logging.error("Это сообщение об ошибке")
logging.critical("Это критическое сообщение об ошибке")

4. Формат вывода логов

Вы можете использоватьbasicConfigспособ настройки формата вывода логов. Например:

Пример

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    datefmt="%Y-%m-%d %H:%M:%S"
)

5. Вывод логов в файл

По умолчанию логи выводятся в консоль. Если вы хотите сохранять логи в файл, это можно настроить так:

Пример

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
    filename="app.log"
)

Расширенное использование модуля logging

1. Использование нескольких логгеров

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

Пример

logger = logging.getLogger("my_logger")
logger.setLevel(logging.DEBUG)

# Создать файловый обработчик
file_handler = logging.FileHandler("my_logger.log")
file_handler.setLevel(logging.DEBUG)

# Создать консольный обработчик
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)

# Установить формат логов
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
file_handler.setFormatter(formatter)
console_handler.setFormatter(formatter)

# Добавить обработчики в логгер
logger.addHandler(file_handler)
logger.addHandler(console_handler)

# Записывать логи
logger.debug("Это отладочное сообщение")
logger.info("Это общее сообщение")

2. Фильтры логов

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

Пример

class MyFilter(logging.Filter):
    def filter(self, record):
        return record.levelno == logging.ERROR

logger.addFilter(MyFilter())

3. Ротация логов

Когда файл лога становится слишком большим, можно использоватьRotatingFileHandlerилиTimedRotatingFileHandlerчтобы реализовать ротацию логов:

Пример

from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler("app.log", maxBytes=1024, backupCount=3)
logger.addHandler(handler)

Общие атрибуты и методы модуля logging

1. Основные классы

КлассОписаниеПример
logging.LoggerLogger, используется для выдачи сообщений лога (получается с помощьюlogging.getLogger(name)get)logger = logging.getLogger("my_logger")
logging.HandlerHandler, определяет назначение вывода логов (например, файлы, консоль и т. д.)handler = logging.FileHandler("app.log")
logging.FormatterFormatter, управляет форматом вывода логовformatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
logging.FilterFilter, используется для более тонкого управления записью логовfilter = logging.Filter("module.name")

2. Общие методы объекта Logger

МетодОписаниеПример
logger.setLevel(level)Установить уровень логирования (например,logging.DEBUG、logging.INFO)logger.setLevel(logging.DEBUG)
logger.debug(msg)Записывать логи уровня DEBUGlogger.debug("调试信息")
logger.info(msg)Записывать логи уровня INFOlogger.info("程序启动")
logger.warning(msg)Записывать логи уровня WARNINGlogger.warning("磁盘空间不足")
logger.error(msg)Записывать логи уровня ERRORlogger.error("操作失败")
logger.critical(msg)Записывать логи уровня CRITICALlogger.critical("系统崩溃")
logger.addHandler(handler)Добавить обработчикlogger.addHandler(handler)
logger.addFilter(filter)Добавить фильтрlogger.addFilter(filter)

3. Общие типы обработчиков

Тип обработчикаОписаниеПример
StreamHandlerВывод в поток (например, консоль)handler = logging.StreamHandler()
FileHandlerВывод в файлhandler = logging.FileHandler("app.log")
RotatingFileHandlerРазделение логов по размеру файлаhandler = logging.RotatingFileHandler("app.log", maxBytes=1e6, backupCount=3)
TimedRotatingFileHandlerРазделение логов по времениhandler = logging.TimedRotatingFileHandler("app.log", when="midnight")
SMTPHandlerОтправка логов по электронной почтеhandler = logging.SMTPHandler("mail.example.com", "[email protected]", "[email protected]", "Error Log")

4. Уровни логирования (константы)

УровеньЗначениеОписание
CRITICAL50Критическая ошибка, программа, возможно, не сможет продолжить работу
ERROR40Ошибка, но программа всё ещё может работать
WARNING30Предупреждающее сообщение (уровень по умолчанию)
INFO20Информация о работе программы
DEBUG10Отладочная информация
NOTSET0Наследовать уровень родительского логгера

5. Общие поля формата Formatter

ПолеОписаниеПример вывода
%(asctime)sВремя создания лога2023-01-01 12:00:00,123
%(levelname)sНазвание уровня логированияINFO
%(message)sСодержимое сообщения журналаProgram started successfully.
%(name)sИмя логгераmy_logger
%(filename)sИмя файла, в котором был сгенерирован логapp.py
%(lineno)dНомер строки, в которой был сгенерирован лог42
%(funcName)sИмя функции, в которой был сгенерирован логmain

6. Методы быстрой настройки

МетодОписаниеПример
logging.basicConfig()Настройка в один клик уровня логирования, обработчиков и формата (обычно вызывается в точке входа программы)logging.basicConfig(level=logging.INFO, format='%(levelname)s - %(message)s')

Общие параметры:

  • level: Установить уровень корневого логгера

  • filename: Вывод в файл

  • filemode: Режим файла (например,'w'перезапись)

  • format: Форматная строка

  • datefmt: Формат даты (например"%Y-%m-%d %H:%M:%S")

Пример

1. Базовая конфигурация

Пример

import logging

# Настройка логирования
logging.basicConfig(
    level=logging.DEBUG,
    format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
    filename='app.log'
)

# Использовать
logger = logging.getLogger("my_app")
logger.info("Программа запущена")

2. Сложная конфигурация с несколькими обработчиками

Пример

import logging

# Создать логгер
logger = logging.getLogger("my_module")
logger.setLevel(logging.DEBUG)

# Консольный обработчик
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.WARNING)

# Файловый обработчик
file_handler = logging.FileHandler("debug.log")
file_handler.setLevel(logging.DEBUG)

# Форматирование
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
console_handler.setFormatter(formatter)
file_handler.setFormatter(formatter)

# Добавить обработчики
logger.addHandler(console_handler)
logger.addHandler(file_handler)

# Использовать
logger.debug("Отладочное сообщение")  # Записывать только в файл
logger.warning("Предупреждение!")  # Вывод и в консоль, и в файл

3. Разделение логов

Пример


from logging.handlers import RotatingFileHandler

handler = RotatingFileHandler(
    "app.log", maxBytes=1e6, backupCount=3  # 1MB на файл, хранить 3 резервные копии
)
logger.addHandler(handler)
Другие расширения