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

时间:2014-04-02 10:04:08

标签: python logging

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

考虑到某些事情是多余的,例如文件日志位置,我想要将日志记录抽象到自己的类,并将实例导入我需要记录的每个类中。但是我不确定这是不是最佳做法?

3 个答案:

答案 0 :(得分:23)

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

logger = logging.getLogger(__name__)

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

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

答案 1 :(得分: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]

参考 - Good-logging-practice-in-python

答案 2 :(得分:1)

使用结构化日志记录。两种出色的工具:

  • Eliot:记录该事件的原因
  

大多数日志记录系统会告诉您应用程序中发生了什么,   而eliot也会告诉您发生原因的原因。

     

eliot是一个Python日志记录系统,其输出因果链   动作:动作可以产生其他动作,最终它们要么   成功或失败。生成的日志告诉您有关您的情况的故事   软件做到了:发生了什么,以及什么原因。

  • Structlog:通过在日志条目中添加结构,structlog使Python的登录过程更轻松,功能更强大。
  

结构化的日志记录意味着您不必编写难以解析的记录,并且   日志中难以保持一致的散文,但您记录事件   而是发生在上下文中。


我在艾略特(Eliot)方面经历了非常积极的经历。