我已经使用logging模块将日志添加到Python 2应用程序中。 现在,我想根据记录的最糟糕的情况在结尾处添加结束语句。
如果记录的最糟糕的事件的信息级别为INFO或更低,则打印“成功!”
如果记录的最糟糕的事件具有警告级别,请写上“ SUCCESS !,并显示警告。请检查日志”
如果记录的最糟糕的事件具有错误级别,请输入“ FAILURE”。
是否可以从记录器获取此信息?我缺少的一些内置方法,例如 logging.getWorseLevelLogSoFar
?
我目前的计划是将所有日志调用(logging.info
等)替换为对类中包装函数的调用,该类也跟踪该信息。
我还考虑过以某种方式释放日志文件,读取并解析它,然后附加到它。这似乎比我目前的计划还要糟糕。
还有其他选择吗?这似乎不是一个独特的问题。
我正在使用根记录器,并且希望继续使用它,但是如果解决方案必要,可以更改为命名记录器。
答案 0 :(得分:2)
正如您自己说的那样,我认为编写包装函数是最简洁,最快的方法。问题是,如果您不在一个类中工作,则需要一个全局变量
global worst_log_lvl = logging.NOTSET
def write_log(logger, lvl, msg):
logger.log(lvl, msg)
if lvl > worst_log_lvl:
global worst_log_lvl
worst_log_lvl = lvl
或使worst_log_lvl
成为自定义类的成员,您可以在其中模拟logging.logger
的签名,而不是实际的记录器使用
class CustomLoggerWrapper(object):
def __init__(self):
# setup of your custom logger
self.worst_log_lvl = logging.NOTSET
def debug(self):
pass
# repeat for other functions like info() etc.
答案 1 :(得分:1)
由于仅使用根记录器,因此可以在其上附加一个过滤器,以跟踪级别:
import argparse
import logging
import random
LEVELS = ['DEBUG', 'INFO', 'WARNING', 'ERROR', 'CRITICAL']
class LevelTrackingFilter(logging.Filter):
def __init__(self):
self.level = logging.NOTSET
def filter(self, record):
self.level = max(self.level, record.levelno)
return True
def main():
parser = argparse.ArgumentParser()
parser.add_argument('maxlevel', metavar='MAXLEVEL', default='WARNING',
choices=LEVELS,
nargs='?', help='Set maximum level to log')
options = parser.parse_args()
maxlevel = getattr(logging, options.maxlevel)
logger = logging.getLogger()
logger.addHandler(logging.NullHandler()) # needs Python 2.7
filt = LevelTrackingFilter()
logger.addFilter(filt)
for i in range(100):
level = getattr(logging, random.choice(LEVELS))
if level > maxlevel:
continue
logger.log(level, 'message')
if filt.level <= logging.INFO:
print('SUCCESS!')
elif filt.level == logging.WARNING:
print('SUCCESS, with warnings. Please check the logs.')
else:
print('FAILURE')
if __name__ == '__main__':
main()