确定是否在Python中将根记录器设置为DEBUG级别?


92

如果使用以下命令行参数将日志记录模块设置为DEBUG:

if (opt["log"] == "debug"):
  logging.basicConfig(level=logging.DEBUG)

以后如何判断记录器是否设置为DEBUG?我正在编写一个装饰器,如果将True标志传递给它,它将为函数计时,如果没有给出标志,则默认情况下,当根记录器设置为DEBUG时,它会打印计时信息。


您最终将想要使用特定的东西,而不是将其耦合到记录器,例如opt [“ time_functions”](根据其他选项,您可能默认将其设置为True / False)。

Answers:


114
logging.getLogger().getEffectiveLevel()

logging.getLogger() 不带参数的将获取根级别记录器。

http://docs.python.org/library/logging.html#logging.Logger.getEffectiveLevel


太好了,谢谢!我正在做类似的事情(除了将明确的“ root”传递给getLogger),但是在记录器设置为调试之前,我是在装饰器的init函数中完成的:\
gct

5
如果您想要级别的名称,而不是数字,则可以使用此名称将级别转换为字符串(例如'INFO'):logging.getLevelName()
guettli

2
@ guettli,getLevelName()需要一个参数,该参数包含要获取其文本表示形式的级别。因此,呼叫实际上就是这个野兽:logging.getLevelName(logging.getLogger().getEffectiveLevel())。当您想要的只是当前级别的字符串时,使用更简单的语法会很好。
Trutane

要将级别整数转换为名称:docs.python.org/3/library/logging.html#levels
EddyTheB

103

实际上,有一个更好的方法:使用代码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()

4
这应该是公认的答案,因为它以较低的运行时复杂度执行相同的操作。
AndyJost

1
如果是实际代码而不是图像。仍然:已投票。
kaiser

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.