Сообщить об ошибке.

Пакет logging, ведение журнала в Python

Ведение журнала событий для приложений

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

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

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

Если нужно срочно добавить ведение журнала логов в какой-то существующий проект или стоит цель - просто начать работу с простыми и разумными настройками, то обратите внимание на продуманную "обертку" модуля logging - log2d.

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

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

Стандартные уровни логирования пакета logging.

Стандартные уровни и их применимость описаны в порядке возрастания серьезности:

УровеньЧисловое
значение
Когда используется
logging.NOTSET0Сообщения отключены.
logging.DEBUG10Подробная информация, как правило, интересна только при диагностике проблем.
logging.INFO20Подтверждение того, что все работает как положено
logging.WARNING30Указание на то, что произошло что-то неожиданное или указание на проблему в ближайшем будущем, например недостаточно места на диске. Программное обеспечение все еще работает как ожидалось.
logging.ERROR40Из-за более серьезной проблемы программное обеспечение не смогло выполнить какую-либо функцию.
logging.CRITICAL50Серьезная ошибка, указывающая на то, что сама программа не может продолжить работу.

Уровень по умолчанию - WARNING, это означает, что будут отслеживаться только события этого уровня и выше, если пакет logging не настроен на обратное.

Самый простой способ обработки отслеживаемых событий - вывести сообщения на консоль.

Примеры:

Самое простое использование с выводом сообщений на консоль.

>>> import logging
>>> logging.debug('debug message')
>>> logging.info('info message')
>>> logging.warning('warning message') 
# WARNING:root:warning message
>>> logging.error('error message')
# ERROR:root:error message
>>> logging.critical('critical message')
# CRITICAL:root:critical message

Сообщение INFO и DEBUG не появляются потому, что уровень регистрации событий по умолчанию - WARNING. Сообщение включает в себя указание уровня и описание события, приведенного в журнале вызовов.

Для того что бы увидеть все сообщения необходимо в настройки регистратора передать уровень выводимых ошибок.

Обратите внимание, что параметры logging.basicConfig() должны передаваться до первого вызова функций ведения журнала. Если в консоли интерпретатора уже была вызвана хотя бы одна функция, то необходимо перезагрузить пакет logging или выйти и снова зайти в консоль интерпретатора. С версии Python-3.8 для этой цели можно использовать ключевой аргумент force=True

# перезагружаем модуль 'logging'
>>> import importlib
>>> importlib.reload(logging)
# <module 'logging' from '/usr/lib/python3.7/logging/__init__.py'>
>>> logging.basicConfig(level=logging.DEBUG)
>>> logging.debug('debug message')
# DEBUG:root:debug message
>>> logging.info('info message')
# INFO:root:info message
>>> logging.warning('warning message') 
# WARNING:root:warning message
...

Так же в конфигурации регистратора logging.basicConfig() можно задать любое форматирование выводимой строки с отслеживаемым событием.

# перезагружаем модуль 'logging'
>>> import importlib
>>> logging.basicConfig(
... level=logging.DEBUG, force=True
... format='[%(asctime)s] [%(levelname)s] %(message)s',
... datefmt='%Y-%m-%d %H:%M:%S')
>>> logging.debug('debug message')
# [2020-06-07 15:37:15] [DEBUG] debug message
>>> logging.info('info message')
# [2020-06-07 15:37:23] [INFO] info message
>>> logging.warning('warning message') 
# [2020-06-07 15:37:27] [WARNING] warning message
...