I want to log DEBUG and INFO to stdout
and the rest to stderr
. I set up a filter and am creating a logger with two different handlers:
import logging
# https://stackoverflow.com/questions/16061641/
class InfoFilter(logging.Filter):
'''Filter used to catch DEBUG and INFO for stdout_handler'''
def filter(self, rec):
return rec.levelno in (logging.DEBUG, logging.INFO)
def setup_logger(name):
formatter = logging.Formatter(
fmt='%(asctime)s - %(levelname)s - %(module)s - %(message)s'
)
stdout_handler = logging.StreamHandler()
stdout_handler.setLevel(logging.DEBUG)
stdout_handler.addFilter(InfoFilter())
stdout_handler.setFormatter(formatter)
stderr_handler = logging.StreamHandler()
stderr_handler.setLevel(logging.WARNING)
stderr_handler.setFormatter(formatter)
logger = logging.getLogger(name)
logger.addHandler(stdout_handler)
logger.addHandler(stderr_handler)
return logger
I understand that this should create a logger with two different StreamHandlers, one of which should be handling DEBUG and INFO. However, DEBUG and INFO messages are not logged, while WARNING is:
>>> import log
>>> logger = log.setup_logger('root')
>>> logger.debug('debug')
>>> logger.warning('warning')
2017-12-29 12:07:16,561 - WARNING - <stdin> - warning
>>> logger.info('info')