代码之家  ›  专栏  ›  技术社区  ›  Emilio M Bumachar

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

  •  1
  • Emilio M Bumachar  · 技术社区  · 6 年前

    我已经使用 logging 现在我想在结尾添加一个结束语句,这取决于记录的最坏情况。

    如果记录的最坏事件达到警告级别,请写“成功!,带有警告。请检查日志“

    如果记录的最坏情况是错误级别,则写入“FAILURE”。

    有没有办法从记录器获取这些信息?一些我缺少的内置方法,比如 logging.getWorseLevelLogSoFar ?

    logging.info 在一个类中调用包装函数,这个类也跟踪这些信息。

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

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   Vinay Sajip    6 年前

    由于您只使用根记录器,因此可以在其上附加一个过滤器,以跟踪级别:

    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()
    
        2
  •  2
  •   meetaig    6 年前

    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.