Лучшая практика Python с точки зрения ведения журнала

При использовании модуля logging из python для ведения журнала. Лучше всего определять регистратор для каждого класса?

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


person Lucas Kauffman    schedule 02.04.2014    source источник


Ответы (3)


Использовать конфигурацию ведения журнала JSON или YAML. После Python 2.7 вы можете загружать конфигурацию ведения журнала из словаря. Это означает, что вы можете загрузить конфигурацию ведения журнала из файла JSON или YAML.

Пример 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]

Ссылка — Хорошая-практика-логирования-в-питоне< /а>

person onsy    schedule 02.04.2014

Лучшей практикой является следование правилам Python для (де)композиции программного обеспечения — модуль является единицей программного обеспечения Python, а не классом. Следовательно, рекомендуемый подход заключается в использовании

logger = logging.getLogger(__name__)

в каждом модуле и настроить ведение журнала (используя basicConfig() или dictConfig()) из основного скрипта.

Регистраторы - это синглтоны - нет смысла передавать их или хранить в экземплярах ваших классов.

person Vinay Sajip    schedule 02.04.2014
comment
Идет ли logger = logging.getLogger(__name__) вверху модуля или внутри каждой функции/метода, который хочет логировать? - person industryworker3595112; 31.10.2016
comment
@industryworker3595112 вверху модуля (после операторов import) - person Vinay Sajip; 31.10.2016

Используйте структурированное ведение журнала. Два отличных инструмента для этого:

  • Элиот: ведение журнала, в котором рассказывается, почему это произошло

Большинство систем журналирования сообщают вам, что произошло в вашем приложении, тогда как eliot также сообщает вам, почему это произошло.

eliot — это система ведения журнала Python, которая выводит причинно-следственные цепочки действий: действия могут порождать другие действия, и в конечном итоге они либо успешны, либо терпят неудачу. Полученные журналы рассказывают вам историю того, что делало ваше программное обеспечение: что произошло и что вызвало это.

  • Structlog: structlog делает ведение журнала в Python менее болезненным и более эффективным, добавляя структуру к вашим записям журнала. .

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


У меня был очень положительный опыт с Элиотом.

person Hatshepsut    schedule 07.12.2018