确定根记录器是不是在 Python 中设置为 DEBUG 级别?
Posted
技术标签:
【中文标题】确定根记录器是不是在 Python 中设置为 DEBUG 级别?【英文标题】:Determining if root logger is set to DEBUG level in Python?确定根记录器是否在 Python 中设置为 DEBUG 级别? 【发布时间】:2010-12-31 13:01:35 【问题描述】:如果我使用如下命令行参数将日志记录模块设置为 DEBUG:
if (opt["log"] == "debug"):
logging.basicConfig(level=logging.DEBUG)
我以后如何判断记录器是否设置为调试?我正在写一个装饰器 如果 True 标志传递给它,将计时一个函数,如果没有给出标志,它默认 当 root logger 设置为 DEBUG 时打印计时信息。
【问题讨论】:
您最终会想要使用特定的东西而不是将其耦合到记录器,例如 opt["time_functions"](根据其他选项,您可能会默认为 True/False)。跨度> 【参考方案1】:logging.getLogger().getEffectiveLevel()
logging.getLogger()
不带参数获取根级别记录器。
http://docs.python.org/library/logging.html#logging.Logger.getEffectiveLevel
【讨论】:
太好了,谢谢!我正在做类似的事情(除了将显式“root”传递给getLogger),但我是在我的装饰器的 init 函数中进行的,在记录器设置为调试之前:\ 如果你想要级别的名称,而不是数字,你可以使用它来将数字转换为字符串(如'INFO'):logging.getLevelName() @guettli,getLevelName() 需要一个参数,其中包含您想要获取其文本表示的级别。所以这个电话实际上是这个野兽:logging.getLevelName(logging.getLogger().getEffectiveLevel())
。当你想要的只是当前关卡的字符串时,最好有一个更简单的语法。
将级别整数转换为名称:docs.python.org/3/library/logging.html#levels【参考方案2】:
其实还有一个更好的方法:使用代码logging.getLogger().isEnabledFor(logging.DEBUG)
。我在尝试了解如何处理 getEffectiveLevel()
的结果时发现了它。
以下是日志模块本身使用的代码。
def getEffectiveLevel(self):
"""
Get the effective level for this logger.
Loop through this logger and its parents in the blogger hierarchy,
looking for a non-zero logging level. Return the first one found.
"""
logger = self
while logger:
if logger.level:
return logger.level
logger = logger.parent
return NOTSET
def isEnabledFor(self, level):
"""
Is this logger enabled for level ‘level’?
"""
if self.manager.disable >= level:
return 0
return level >= self.getEffectiveLevel()
【讨论】:
这应该是公认的答案,因为它的运行时复杂度较低。【参考方案3】:只是
logging.getLogger().level == logging.DEBUG
【讨论】:
这是一个糟糕的答案;它仅适用于检查 exact 级别,而不是像其他地方的评论那样有效。isEnabledFor()
就是因为这个原因而存在的!以上是关于确定根记录器是不是在 Python 中设置为 DEBUG 级别?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 XCTest 测试一个 navigationBar 是不是未在 Objective-C 中设置为特定颜色?
从 DB 获取数据以在下拉 HTML/CSS/MYSQL/PHP 中设置为默认值