我有一个root logger对象,我通过init调用传递给另一个模块。
Root_Script.py
import logging
import module
global logger
*initialize logger*
#call module.py and pass the logger to it
module.LOG_TEST(logger)
Module.py
import logging
class LOG_TEST(logger):
self.logger=logger
## want to set up a log level for this particular logger ##
所以我有一组这样的模块,我想为它设置不同的记录器配置。就像我想为这些模块设置LogLevel为ERROR。
现在我想使用一个配置文件,我可以在每个模块中调用它,它应该更改日志级别。所以我浏览了Logging Documentation并对其进行了重点跟踪。
我用过
self.logger=logger.getLogger()
self.logger.setLevel(logging.ERROR)
实现这一目标,但它不起作用。任何人都可以向我指出如何使用配置文件设置这个以及我在这里做错了什么?
P.S。我不想改变将记录器对象直接传递给每个模块的事实。请帮助我,不做任何改动。
谢谢!
答案 0 :(得分:1)
logger.getLogger()
每次调用时都返回相同的根记录器对象,因此您正在修改相同的记录器。即任何地方进行setLevel()
调用都会改变根记录器的行为。
相反,对于另一组模块,请使用logger.getLogger("mymodules")
。这将返回一个新的记录器实例。在此记录器上调用setLevel()
不会影响根记录器。
来自文档:
该名称可能是一个以句点分隔的层次结构值,例如 foo.bar.baz(例如,它也可能只是普通的foo)。 分层列表中较低位的记录器是 记录器在列表中更高。例如,给定一个带有名称的记录器 of foo,名称为foo.bar,foo.bar.baz和foo.bam的记录器 所有foo的后代。记录器名称层次结构类似于 Python包层次结构,如果你组织你的相同 基于每个模块的记录器使用推荐的结构 logging.getLogger(的名称强>)。那是因为在模块中,名称是 Python包命名空间中的模块名称。
答案 1 :(得分:1)
首先,python上的logging
个实例是单例,这意味着如果您在代码的任何位置调用getLogger()
,那么您将获得相同的logger
实例
我会创建与您需要的不同类型的记录器一样多的实例,这样您就不需要将它们传递给soubmodules,您可以使用它们的名称来调用它们。你必须先给他们一个名字:
logger = logging.getLogger('logger_with_error')
由于logger是一个单身人士,我不认为在执行中不断切换记录器类型是个好主意,这可能会导致问题。