Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 使用logger对象而不是使用日志记录有什么好处?_Python_Python 3.x_Logging - Fatal编程技术网

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

Python 使用logger对象而不是使用日志记录有什么好处?,python,python-3.x,logging,Python,Python 3.x,Logging,使用Python和logging库,您可以通过dictlog\u config和 logging.config.dictConfig(log_config) 您可以通过logging.info登录,或创建一个记录器对象并使用它。拥有logger对象的好处是什么?logger根据其名称(使用“点.路径”表示法)形成一个层次结构,根logger位于顶部。创建记录器的标准方法是每个模块有一个记录器,根据模块的\uuu name\uuuu属性命名,因此如果您有一个名为“mylib”的包,其中包含模块“

使用Python和
logging
库,您可以通过dict
log\u config

logging.config.dictConfig(log_config)

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

logger根据其名称(使用“点.路径”表示法)形成一个层次结构,根logger位于顶部。创建记录器的标准方法是每个模块有一个记录器,根据模块的
\uuu name\uuuu
属性命名,因此如果您有一个名为“mylib”的包,其中包含模块“utils”、“core”和“api”,那么您将有记录器“mylib”、“mylib.utils”、“mylib.core”和“mylib.api”,其中最后三个是“mylib”的子级(这当然是根记录器的子级)

由此,您可以只配置根记录器,或者更具体地配置“mylib”记录器,或者更具体地配置ie“mylib.api”(请注意,默认情况下,记录器会传播到其父级)。如果您只在所有包中直接使用
日志记录
,则无法为每个包/模块自定义子日志记录程序

这里的要点是,Logger调用应该与Logger配置分离-库代码定义并调用Logger,配置是使用库的应用程序的职责。原因显然是,库作者不知道哪些应用程序将使用库代码,也不知道应用程序的作者希望如何配置他的Logger。This系统为应用程序的作者(或系统管理员或负责配置/部署应用程序的人)提供对记录器配置的完整、细粒度控制。如果您的所有库代码都只使用根记录器,则应用程序作者/管理员/用户不能对每个库/模块进行不同的设置,并且他会因为您的侵入行为而憎恨您(如果您的库试图以任何方式干扰记录器配置,我们不要谈论他会有什么感觉)

长话短说:遵守正常惯例,使用
logger=logging.getLogger(\uuu name\uuu)
在您的模块中,不要尝试在库代码中配置日志记录,您的库用户会很高兴的


编辑:正如您在评论中提到的,如果应用程序在导入lib后配置日志记录,并且没有将
禁用现有的日志记录设置为False,那么在模块级声明日志记录程序可能会导致问题。就我而言,在导入任何其他内容之前配置日志记录和/或使用t
禁用现有的日志记录程序
为False。首先配置日志记录程序是个好主意,因为它将允许库代码在导入时记录最终问题…

在配置中,您可能定义了不同的日志记录程序,由不同的处理程序拾取,因此使用一个特定的日志记录程序会影响系统的各个方面日志语句:记录位置(文件名、控制台),选择哪个级别和更高级别,日志条目的格式,…好的,所以当您有多个日志对象时,您希望有日志对象。如果您只有一个,那么就没有优势。对吗?@Martintoma没有每个模块的日志记录程序没有优势,请参阅我的答案。@Brunodesshuilliers是的,有。它更简单。您不必更改创建一个logger对象。@Martintoma创建一个logger是36个字符长的一行代码。如果你有一个像样的编辑器,你甚至可以将它配置为在所有新的.py文件的顶部自动插入这一行。考虑到正确的日志配置的好处与查找相关信息(以GB为单位的行噪声)的痛苦相比,我坚持这一点没有正确命名的记录器没有好处。那么“”呢?答案在同一篇文章中:“由于Python2.7,在fileConfig和dictConfig(作为模式中的参数)中添加了一个新的参数名“disable_existing_loggers”,通过将其设置为False,可以解决上述问题”根据本文,这是否意味着我必须在模块中的每个函数中玷污记录器?!