在WARNING级别记录到文件并在INFO级别打印到stdout

时间:2015-09-25 07:23:01

标签: python logging

我想控制我在哪个级别登录文件,以及在哪个级别打印到stdout。更确切地说,在这种情况下,我希望将logger打印INFO|WARNING|ERROR条消息发送到stdout并将WARNING|ERROR条消息记录到文件中。

这就是我目前的情况:

import logging

# Logging
log_filepath = 'log_file.log'
logger = logging.getLogger('My logger')
hdlr = logging.FileHandler( log_filepath )
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
hdlr.setFormatter(formatter)
logger.addHandler(hdlr) 
logger.setLevel(logging.WARNING)

# Logging to stdout
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.INFO)
ch.setFormatter(formatter)
logger.addHandler(ch)

# Usage
logger.info('Hello')       # Show infos but do not log to file (does not show in stdout)
logger.warning('Oops')     # Show warnings and log to file
logger.error('Dang!')      # Show errors and log to file

但是,INFO级别的消息不会显示在stdout中。那是为什么?

我在OS X Mavericks上。

2 个答案:

答案 0 :(得分:4)

您的问题是您将记录器级别设置为WARNING。因此,所有处理程序都从警告级别进行记录。

您应该将文件记录器处理程序设置为级别警告,并将记录器本身设置为级别INFO或不设置。默认级别为NOTSET,表示处理或委派所有邮件。

hdlr.setLevel(logging.WARNING)
logger.setLevel(logging.INFO)

答案 1 :(得分:3)

正如已经指出的那样,您的记录器级别设置为WARNING,因此消息将被过滤并且不会到达处理程序。我还建议使用dictConfig

import logging.config

logging.config.dictConfig({
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'formatter': {
            'format': '%(asctime)s %(levelname)s %(message)s',
        },
    },
    'handlers': {
        'stderr': {
            'class': 'logging.StreamHandler',
            'formatter': 'formatter',
            'level': 'INFO',
        },
        'log_file': {
            'class': 'logging.FileHandler',
            'filename': 'log_file.log',
            'mode': 'a',
            'formatter': 'formatter',
            'level': 'WARNING',
        },
    },
    'loggers': {
        '': {
            'level': 'INFO',
            'handlers': ['stderr', 'log_file'],
        },
    },
})