1

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')
Jimmy Sanchez
  • 721
  • 2
  • 7
  • 17

0 Answers0