使用python中的logging
模块进行日志记录时。为每个类定义记录器是最佳做法吗?
考虑到某些事情是多余的,例如文件日志位置,我想要将日志记录抽象到自己的类,并将实例导入我需要记录的每个类中。但是我不确定这是不是最佳做法?
答案 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]
答案 2 :(得分:1)
使用结构化日志记录。两种出色的工具:
大多数日志记录系统会告诉您应用程序中发生了什么, 而eliot也会告诉您发生原因的原因。
eliot是一个Python日志记录系统,其输出因果链 动作:动作可以产生其他动作,最终它们要么 成功或失败。生成的日志告诉您有关您的情况的故事 软件做到了:发生了什么,以及什么原因。
结构化的日志记录意味着您不必编写难以解析的记录,并且 日志中难以保持一致的散文,但您记录事件 而是发生在上下文中。
我在艾略特(Eliot)方面经历了非常积极的经历。