【发布时间】:2019-06-12 08:42:14
【问题描述】:
我目前正在创建logging.Logger 的子类,它具有基于级别的过滤器,并且此级别可以在日志调用之间更改(因此我使用过滤器而不是setLevel()) .但是,无论过滤器如何,我的记录器似乎总是打印出级别为DEBUG 的消息。下面是我的代码
import logging
class _LevelFilter(logging.Filter):
def filter(self, record):
SimpleLogger.setLevel(_DEFAULT_LEVEL)
return 1 if SimpleLogger.isEnabledFor(record.levelno) else 0
class _SimpleLogger(logging.getLoggerClass()):
def __init__(self, name=None, level=logging.DEBUG):
super().__init__(name, level)
self.setLevel(logging.DEBUG)
_handler = logging.StreamHandler()
_handler.setLevel(logging.DEBUG)
self.addHandler(_handler)
self.addFilter(_LevelFilter())
_DEFAULT_LEVEL = 'WARNING'
SimpleLogger = _SimpleLogger()
if __name__ == '__main__':
SimpleLogger.debug('testing debug')
SimpleLogger.info('testing info')
SimpleLogger.warning('testing warning')
SimpleLogger.critical('testing critical')
SimpleLogger.debug('testing debug')
上面的代码给出以下输出:
testing debug
testing warning
testing critical
testing debug
我知道如果我将SimpleLogger 声明为单独的变量而不是子类,它可以工作,但由于各种原因我需要使用子类。作为参考,这是一个不使用有效子类的版本。
SimpleLogger = logging.getLogger()
SimpleLogger.setLevel(logging.DEBUG)
_handler = logging.StreamHandler()
_handler.setLevel(logging.DEBUG)
SimpleLogger.addHandler(_handler)
SimpleLogger.addFilter(_LevelFilter())
_DEFAULT_LEVEL = 'WARNING'
我终其一生都无法弄清楚为什么总是打印调试消息。子类和非子类版本之间的差异不是很大,设置级别应该会导致调试和信息消息不出现。任何帮助将不胜感激,谢谢!
【问题讨论】:
-
你的python安装可能有问题,你用的是什么python版本?它适用于最新的python:onlinegdb.com/rkVJ0NA0V
-
我在 python 3.7.3 中使用 anaconda。
-
我刚刚尝试重新安装 Anaconda,但仍然得到相同的结果。
-
好的,另一个更新:我的代码在 python 3.6 中工作,但在 python 3.7 中不工作。但是,似乎在 python 3.7 的日志库中所做的更改不应该影响我的代码。