Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 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 менее болезненной и более мощной, добавляя структуру в ваши записи журнала.

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


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