Лучшая практика Python с точки зрения ведения журнала
При использовании модуля logging
из python для ведения журнала. Лучше всего определить логгер для каждого класса?
Учитывая, что некоторые вещи были бы лишними, например, местоположение файла журнала, я думал об абстрагировании ведения журнала в своем классе и импортировал экземпляр в каждый из моих классов, требующий регистрации. Однако я не уверен, что это лучшая практика или нет?
Ответы
Ответ 1
Используйте конфигурацию ведения JSON или YAML. После Python 2.7 вы можете загрузить конфигурацию протоколирования из dict. Это означает, что вы можете загрузить конфигурацию ведения журнала из файла JSON или YAML.
Пример Ямл -
version: 1
disable_existing_loggers: False
formatters:
simple:
format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"
handlers:
console:
class: logging.StreamHandler
level: DEBUG
formatter: simple
stream: ext://sys.stdout
info_file_handler:
class: logging.handlers.RotatingFileHandler
level: INFO
formatter: simple
filename: info.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
error_file_handler:
class: logging.handlers.RotatingFileHandler
level: ERROR
formatter: simple
filename: errors.log
maxBytes: 10485760 # 10MB
backupCount: 20
encoding: utf8
loggers:
my_module:
level: ERROR
handlers: [console]
propagate: no
root:
level: INFO
handlers: [console, info_file_handler, error_file_handler]
Ref - Good-logging-practice-in-python
Ответ 2
Лучшей практикой является соблюдение правил Python для программного обеспечения (de) - модуль является единицей программного обеспечения Python, а не класса. Следовательно, рекомендуется использовать
logger = logging.getLogger(__name__)
в каждом модуле и настроить ведение журнала (используя basicConfig()
или dictConfig()
) из основного script.
Логгеры - это синглтоны - нет смысла их передавать или хранить в экземплярах ваших классов.
Ответ 3
Используйте структурированное ведение журнала. Два замечательных инструмента для этого:
- Элиот: Ведение журнала, которое говорит вам, почему это произошло
Большинство систем ведения журнала сообщают вам, что произошло в вашем приложении, тогда как eliot также сообщает, почему это произошло.
eliot - это система регистрации Python, которая выводит причинно-следственные цепочки действий: действия могут порождать другие действия, и в конечном итоге они либо завершаются успешно, либо завершаются неудачей. Полученные журналы рассказывают о том, что делало ваше программное обеспечение: что произошло и что вызвало это.
- Structlog: structlog делает регистрацию в Python менее болезненной и более мощной, добавляя структуру в ваши записи журнала.
Структурированное ведение журнала означает, что вы не пишете в своих журналах трудную для анализа и непротиворечивой прозу, а записываете события, происходящие в контексте.
У меня был очень положительный опыт с Элиотом.