Модуль logging Python
В программировании логирование — очень важный инструмент. Оно помогает отслеживать состояние работы программ, отлаживать ошибки и записывать важную информацию.
Python предоставляет встроенныйloggingмодуль, специально предназначенный для задач логирования. По сравнению с простымиprintинструкциями,loggingмодуль более гибкий и мощный, способен удовлетворять потребности логирования в различных сценариях.
Зачем использовать модуль logging?
- Гибкость:
loggingМодуль позволяет при необходимости задавать уровни логирования, форматы и назначения вывода. - Масштабируемость: Вы можете легко выводить логи в различные назначения, такие как файлы, консоль, сеть и т. д.
- Структурированное логирование:
loggingМодуль поддерживает структурированное логирование, что удобно для последующего анализа и обработки. - Оптимизация производительности: По сравнению с
print,loggingмодуль оптимизирован по производительности и подходит для использования в производственных средах.
Базовое использование модуля logging
1. Импорт модуля logging
Сначала нам нужно импортироватьloggingмодуль:
Пример
2. Настройте уровень логирования
Уровень логирования используется для управления подробностью логов.loggingМодуль предоставляет следующие уровни логирования:
- DEBUG: Подробная отладочная информация, обычно используется во время разработки.
- INFO: Информация во время нормальной работы программы.
- WARNING: Указывает на потенциальные проблемы, но программа всё ещё может нормально работать.
- ERROR: Указывает на ошибки в программе, из-за которых некоторые функции могут работать неправильно.
- CRITICAL: Указывает на серьёзные ошибки, которые могут привести к сбою программы.
Уровень логирования можно задать с помощью следующего кода:
Пример
3. Запись логов
После настройки уровня логирования вы можете использовать следующие методы для записи логов:
Пример
logging.info("Это общее сообщение")
logging.warning("Это предупреждающее сообщение")
logging.error("Это сообщение об ошибке")
logging.critical("Это критическое сообщение об ошибке")
4. Формат вывода логов
Вы можете использоватьbasicConfigспособ настройки формата вывода логов. Например:
Пример
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
datefmt="%Y-%m-%d %H:%M:%S"
)
5. Вывод логов в файл
По умолчанию логи выводятся в консоль. Если вы хотите сохранять логи в файл, это можно настроить так:
Пример
level=logging.DEBUG,
format="%(asctime)s - %(name)s - %(levelname)s - %(message)s",
filename="app.log"
)
Расширенное использование модуля logging
1. Использование нескольких логгеров
В больших проектах может потребоваться создавать независимые логгеры для разных модулей или компонентов. Это можно сделать следующим образом:
Пример
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. Фильтры логов
Вы можете использовать фильтры, чтобы управлять тем, какие логи должны записываться. Например:
Пример
def filter(self, record):
return record.levelno == logging.ERROR
logger.addFilter(MyFilter())
3. Ротация логов
Когда файл лога становится слишком большим, можно использоватьRotatingFileHandlerилиTimedRotatingFileHandlerчтобы реализовать ротацию логов:
Пример
handler = RotatingFileHandler("app.log", maxBytes=1024, backupCount=3)
logger.addHandler(handler)
Общие атрибуты и методы модуля logging
1. Основные классы
| Класс | Описание | Пример |
|---|---|---|
logging.Logger | Logger, используется для выдачи сообщений лога (получается с помощьюlogging.getLogger(name)get) | logger = logging.getLogger("my_logger") |
logging.Handler | Handler, определяет назначение вывода логов (например, файлы, консоль и т. д.) | handler = logging.FileHandler("app.log") |
logging.Formatter | Formatter, управляет форматом вывода логов | formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') |
logging.Filter | Filter, используется для более тонкого управления записью логов | filter = logging.Filter("module.name") |
2. Общие методы объекта Logger
| Метод | Описание | Пример |
|---|---|---|
logger.setLevel(level) | Установить уровень логирования (например,logging.DEBUG、logging.INFO) | logger.setLevel(logging.DEBUG) |
logger.debug(msg) | Записывать логи уровня DEBUG | logger.debug("调试信息") |
logger.info(msg) | Записывать логи уровня INFO | logger.info("程序启动") |
logger.warning(msg) | Записывать логи уровня WARNING | logger.warning("磁盘空间不足") |
logger.error(msg) | Записывать логи уровня ERROR | logger.error("操作失败") |
logger.critical(msg) | Записывать логи уровня CRITICAL | logger.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. Уровни логирования (константы)
| Уровень | Значение | Описание |
|---|---|---|
CRITICAL | 50 | Критическая ошибка, программа, возможно, не сможет продолжить работу |
ERROR | 40 | Ошибка, но программа всё ещё может работать |
WARNING | 30 | Предупреждающее сообщение (уровень по умолчанию) |
INFO | 20 | Информация о работе программы |
DEBUG | 10 | Отладочная информация |
NOTSET | 0 | Наследовать уровень родительского логгера |
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. Базовая конфигурация
Пример
# Настройка логирования
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. Сложная конфигурация с несколькими обработчиками
Пример
# Создать логгер
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)