Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python在日志记录方面的最佳实践_Python_Logging - Fatal编程技术网

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

Python在日志记录方面的最佳实践,python,logging,Python,Logging,使用python中的日志记录模块进行日志记录时。为每个类定义一个记录器是最佳实践吗 考虑到有些事情是多余的,比如文件日志位置,我考虑将日志抽象到它自己的类中,并将一个实例导入需要日志记录的每个类中。但是,我不确定这是否是最佳实践?最佳实践是遵循Python的软件(de)组合规则-模块是Python软件的单元,而不是类。因此,建议的方法是使用 logger = logging.getLogger(__name__) 在每个模块中,并从主脚本配置日志记录(使用basicConfig()或dictC

使用python中的
日志记录
模块进行日志记录时。为每个类定义一个记录器是最佳实践吗


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

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

logger = logging.getLogger(__name__)
在每个模块中,并从主脚本配置日志记录(使用
basicConfig()
dictConfig()


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

使用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]
Ref-

使用结构化日志记录。这方面有两个很好的工具:

  • :记录日志,告诉您发生的原因
大多数日志系统都会告诉您应用程序中发生了什么, 而艾略特也会告诉你为什么会这样

eliot是一个Python日志记录系统,它输出 动作:动作可以产生其他动作,最终它们也可以 成功或失败。生成的日志告诉您您的 软件做到了:发生了什么,是什么导致了它

  • :structlog通过向日志条目添加结构,使Python中的日志记录更轻松、更强大
结构化日志意味着您不需要编写难以解析和修改的日志 很难在日志中保持一致,但要记录事件 相反,这是在一个上下文中发生的



我对Eliot有过非常积极的体验。

是否
logger=logging.getLogger(\uuu\u name\uuuu)
进入模块顶部或每个想要记录的函数/方法内部?@industryworker3595112位于模块顶部(在
导入
语句之后)