Mar*_*oma 6 python logging python-3.x
使用 Python 和logging库,您可以通过字典配置日志记录log_config并
logging.config.dictConfig(log_config)
您可以通过记录logging.info或创建一个记录器对象并使用它。拥有记录器对象有什么好处?
记录器根据其名称(使用“dotted.path”表示法)形成层次结构,根记录器位于顶部。创建记录器的规范方法是每个模块都有一个记录器,根据模块的__name__属性命名,因此如果您有一个名为“mylib”的包,其中包含模块“utils”、“core”和“api”,那么您将拥有记录器“mylib” 、“mylib.utils”、“mylib.core”和“mylib.api”,其中最后三个是“mylib”的子级(当然,它是根记录器的子级)。
由此,您可以仅配置根记录器,或者更具体地配置“mylib”记录器,甚至更具体地配置“mylib.api”(请注意,默认情况下记录器会传播到其父记录器)。相反,如果您仅logging直接在所有包中使用,则您将无法自定义每个包/模块的子记录器。
这里的要点是记录器调用应该与记录器配置分离 - 库代码定义和调用记录器,配置是使用库的应用程序的职责。显然,原因是库作者无法知道哪些应用程序将使用库代码,也不知道应用程序的作者希望如何配置他的记录器。该系统为应用程序的作者(或系统管理员或负责配置/部署应用程序的人员)提供了对记录器配置的全面、细粒度的控制。如果您的所有库代码仅使用根记录器,那么应用程序作者/管理员/用户不能对每个库/模块有不同的设置,并且他(她)会讨厌您如此侵入(我们不谈论他(她)如何如果你的库试图以任何方式真正搞乱记录器配置,你会感觉到)。
长话短说:坚持合理的约定,logger = logging.getLogger(__name__)在模块中使用,不要尝试在库代码中配置日志记录,您的库用户会很高兴。
编辑:正如您在评论中提到的,如果应用程序在导入库后配置日志记录并且未设置disable_existing_loggers为 False,则在模块级别声明记录器可能会导致问题。就我而言,应用程序的作者有责任在导入其他任何内容之前配置日志记录和/或设置disable_existing_loggers为 False。无论如何,首先配置日志记录是一个好主意,因为它将允许库代码在导入时记录最终问题......
| 归档时间: | 
 | 
| 查看次数: | 639 次 | 
| 最近记录: |