使用记录器对象而不是使用日志记录有什么好处?

时间:2018-01-10 11:02:31

标签: python python-3.x logging

使用Python和logging库,您可以通过dict log_config

配置日志记录
logging.config.dictConfig(log_config)

您可以通过logging.info登录或创建记录器对象并使用它。拥有记录器对象有什么好处?

1 个答案:

答案 0 :(得分:3)

记录器根据其名称形成层次结构(使用" dotted.path"表示法),根记录器位于顶部。创建记录器的规范方法是每个模块有一个,从模块的__name__属性命名,所以如果你有一个名为" mylib"使用模块" utils"," core"和" api",你有记录器" mylib"," mylib.utils"," mylib.core"和" mylib.api",其中最后三个是" mylib"的孩子。 (当然是根记录器的孩子)。

从这里你可以只配置根记录器,或者更具体地配置" mylib"记录器,甚至更具体地配置ie" mylib.api" (请注意,默认情况下,记录器会传播到其父级)。如果您只在所有包中直接使用logging,则无法为每个包/模块自定义子记录器。

这里的重点是记录器调用应该与记录器配置分离 - 库代码定义和调用记录器,配置是使用库的应用程序的职责。显然,原因是图书馆作者不知道哪些应用程序将使用库代码,也不知道应用程序的作者如何配置他的记录器。该系统为应用程序的作者(或系统管理员或负责配置/部署应用程序的任何人)提供对记录程序配置的完整,细粒度控制。如果您的所有库代码只使用根记录器,则应用程序作者/ admin / user不能为每个库/模块设置不同的设置,并且他会讨厌您是如此干扰(并且不要谈论如何(s)他会觉得你的图书馆是否试图以任何方式弄乱记录器配置。

简而言之:坚持理智的惯例,在模块中使用logger = logging.getLogger(__name__)尝试配置库代码中的日志记录,您的图书馆用户将很高兴。

编辑:正如您在评论中提到的,如果应用程序在导入您的lib 之后配置日志并且未设置{,则在模块级别声明记录器可能会导致问题{1}}为假。据我所知,应用程序的作者负责在导入任何其他内容之前配置日志记录和/或将disable_existing_loggers设置为False。首先配置日志记录是恕我直言,因为它允许库代码在导入时记录最终的问题...