我可以在Python中动态更改单个处理程序的日志级别吗?

时间:2016-07-21 06:15:09

标签: python logging

我有一个带有两个处理程序的记录器 - 一个用于控制台,另一个用于旋转文件。我为每个处理程序设置了自己的日志级别。我们的想法是,控制台上可以获得重要的消息,而较低级别的内容会转到文件中,以防我需要进一步排除故障。

我的配置文件如下所示:

[loggers]
keys=root

[handlers]
keys=consoleHandler,rotateFileHandler

[formatters]
keys=simpleFormatter

[logger_root]
level=DEBUG
handlers=consoleHandler,rotateFileHandler
qualname=MyApplication
propagate=0

[handler_consoleHandler]
class=StreamHandler
level=ERROR
formatter=simpleFormatter
args=(sys.stdout,)

[handler_rotateFileHandler]
class=handlers.RotatingFileHandler
level=INFO
formatter=simpleFormatter
args=('TESTLOG.log', 'a', 100000, 5, 'utf8')

[formatter_simpleFormatter]
format=%(asctime)s - %(name)s - %(levelname)s - %(message)s
datefmt=

有没有办法动态更改(然后重置)单个处理程序的日志级别?我试图这样做,但它失败了,因为logger是记录器,而不是处理程序。它也已设置为DEBUG,它是设置在更高级别的处理程序。

import logging
import logging.config

logging.config.fileConfig('logging.config', disable_existing_loggers=False)
logger = logging.getLogger('TestLog')

def main():
    logger.debug('debug message')
    logger.info('info message')
    logger.warn('warn message')
    logger.error('error message')
    logger.critical('critical message')
    # Reset log level to debug temporarily
    logger.setLevel(logging.DEBUG)
    logger.debug('This message appears if level was reset to DEBUG')

if __name__ == '__main__':
    main()

我的目标是能够将控制台设置为较低级别(即logging.DEBUG一段时间,然后通过在执行更改之前保存先前级别或明确重置来将其更改回来它)。我做这件事时,我不想触摸其他处理程序。

如何动态更改处理程序日志级别?

2 个答案:

答案 0 :(得分:3)

您必须遍历特定的处理程序:

console_handler = logging.getLogger().handlers[0]
old_level = console_handler.level
console_handler.setLevel(logging.DEBUG)

索引与日志记录配置中的handlers的顺序匹配(在加载配置时,将清除给定记录器上的所有先前处理程序。)

答案 1 :(得分:2)

我知道这很老了,但是我想与大家分享一下,如果您想一次更改一些处理程序,可以像这样搜索与该特定记录器相关的所有处理程序

  for handlers in logger.handlers:
      if type(handlers) == logging.FileHandler:
         if boolcheck():
            handlers.setLevel(logging.DEBUG)
         else:
            handlers.setLevel(logging.INFO)