Python在日志记录方面的最佳实践

Luc*_*man 25 python logging

当使用loggingpython中的模块进行日志记录时.为每个类定义记录器是最佳做法吗?

考虑到一些事情会是冗余的,例如文件日志位置,我正在考虑将日志记录抽象到它自己的类,并将一个实例导入我需要记录的每个类中.但是我不确定这是不是最好的做法?

Vin*_*jip 25

最佳实践是遵循Python的软件(de)组合规则 - 模块是Python软件的单元,而不是类.因此,推荐的方法是使用

logger = logging.getLogger(__name__)
Run Code Online (Sandbox Code Playgroud)

在每个模块中,并配置主脚本的日志记录(使用basicConfig()dictConfig()).

记录器是单件 - 没有必要传递它们或将它们存储在类的实例中.

  • @ industryworker3595112位于模块顶部(在`import`语句之后) (5认同)
  • `logger = logging.getLogger(__name__)` 是在模块的顶部还是在每个想要记录的函数/方法中? (3认同)

小智 19

使用JSON或YAML日志记录配置 - 在Python 2.7之后,您可以从dict加载日志记录配置.这意味着您可以从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]
Run Code Online (Sandbox Code Playgroud)

Ref - Good-logging-practice-in-python