我刚刚记录的最差级别的日志是什么?

时间:2018-08-30 13:18:43

标签: python logging

我已经使用logging模块将日志添加到Python 2应用程序中。 现在,我想根据记录的最糟糕的情况在结尾处添加结束语句。

如果记录的最糟糕的事件的信息级别为INFO或更低,则打印“成功!”

如果记录的最糟糕的事件具有警告级别,请写上“ SUCCESS !,并显示警告。请检查日志”

如果记录的最糟糕的事件具有错误级别,请输入“ FAILURE”。

是否可以从记录器获取此信息?我缺少的一些内置方法,例如 logging.getWorseLevelLogSoFar

我目前的计划是将所有日志调用(logging.info等)替换为对类中包装函数的调用,该类也跟踪该信息。

我还考虑过以某种方式释放日志文件,读取并解析它,然后附加到它。这似乎比我目前的计划还要糟糕。

还有其他选择吗?这似乎不是一个独特的问题。

我正在使用根记录器,并且希望继续使用它,但是如果解决方案必要,可以更改为命名记录器。

2 个答案:

答案 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()