使用 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
,则在模块级别声明记录器可能会导致问题为假。就我而言,应用程序的作者有责任在导入任何其他内容之前配置日志记录和/或将 disable_existing_loggers
设置为 False。恕我直言,首先配置日志记录是一个好主意,因为它将允许库代码在导入时记录最终问题...
关于python - 使用记录器对象而不是使用日志记录有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48185953/