logging模块的Effective Level

2020年5月24日 / 32次阅读 / Last Modified 2020年5月24日
logging模块

说实话,习惯了print,切换到logging模块一开始是不太适应的。但是没办法,在简单难用和复杂好用之间,必须选择后者。必须使用logging,软件系统必须要有自己标准的log子系统。

我学习logging模块的过程,除了看看网上的文章,就是直接阅读源代码。因为logging模块的使用,我感觉还是有些复杂的,网上的文章都TM说不清楚。本文说一下Effective Level的概念。

通过logging.getLogger(name)创建新的logger之后,默认这个logger的level是NOTSET(就是0),此时它的Effective Level是其向上追溯所有父亲logger的第一个非0 level。

def getEffectiveLevel(self):
        """
        Get the effective level for this logger.

        Loop through this logger and its parents in the logger 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'?
        """
        try:
            return self._cache[level]
        except KeyError:
            _acquireLock()
            if self.manager.disable >= level:
                is_enabled = self._cache[level] = False
            else:
                is_enabled = self._cache[level] = level >= self.getEffectiveLevel()
            _releaseLock()

            return is_enabled

默认情况下,当我们执行新创建的logger.warning(string)时,比较的Effective Level第1一个level不为0的父节点的。用此Level来判断是否能够record。如果能够record,此logger.propagate不为0,就会把log传给父亲的handlers去处理。

isEnabledFor函数是在做具体record之前做的判断,这段代码就是在比较Effective Level。不过,在这之前,代码还比较了manager的disable。整个logging模块有一个manager,挂在各个logger.manager下面,manager.disable就是一个全局的抑制log的工具,不过这个工具没有提供修改的接口,一般也用不到的。

-- EOF --

本文链接:https://www.pynote.net/archives/1993

留言区

《logging模块的Effective Level》有1条留言

电子邮件地址不会被公开。 必填项已用*标注

  • 麦新杰

    isEnableFor就是在debug, info, error, warning, critical函数调用后的第1个判断。 [回复]


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top