2020年5月24日 / 226次阅读 / 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条留言
©Copyright 麦新杰 Since 2019 Python笔记
isEnableFor就是在debug, info, error, warning, critical函数调用后的第1个判断。 [ ]