简体   繁体   中英

Logging at WARNING level to file and print to stdout at INFO level

I would like to control at which level I log to file, and at which level I print to stdout. To be more precise in this case, I wish to make logger print INFO|WARNING|ERROR messages to stdout and log WARNING|ERROR messages to file.

This is what I have currently:

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

However, INFO level messages do not show up in stdout. Why is that?

I'm on OS X Mavericks.

Your problem is that you set level of logger to WARNING. Therefore all your handlers are logging from warning level.

You should set file logger handler to level WARNING and logger itself to level INFO or not set. Default level is NOTSET which means that all messages are processed or delegated.

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

As already pointed out, your logger level is set to WARNING, so messages are filter in it and do not reach the handler. I would also suggest using 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'],
        },
    },
})

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM