Search code examples
pythonpython-3.xlogging

Set two different debug levels in logger module


I have the following which creates two loggers -- stream logger and file logger.

# Set up the Logging modules
tmp_file = tempfile.NamedTemporaryFile(mode='w+')
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
c_handler = logging.StreamHandler()
f_handler = logging.FileHandler(tmp_file.name)
c_handler.setFormatter(logging.Formatter('[%(asctime)s %(levelname)s]\t%(message)s'))
f_handler.setFormatter(logging.Formatter('[%(asctime)s] - %(levelname)s %(funcName)s:L%(lineno)s: %(message)s'))
logger.addHandler(c_handler)
logger.addHandler(f_handler)

I would like the Stream loger to have level of logging.INFO (it is currently correct) and the File logger to have level of logging.DEBUG. How would I do this?


Solution

  • You can use the Handler.setLevel method to set individual logging level for each handler, on top of the level set for the logger object:

    tmp_file = tempfile.NamedTemporaryFile(mode='w+')
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.DEBUG) # note here
    c_handler = logging.StreamHandler()
    c_handler.setLevel(logging.INFO) # note here
    f_handler = logging.FileHandler(tmp_file.name)
    f_handler.setLevel(logging.DEBUG) # note here
    c_handler.setFormatter(logging.Formatter('[%(asctime)s %(levelname)s]\t%(message)s'))
    f_handler.setFormatter(logging.Formatter('[%(asctime)s] - %(levelname)s %(funcName)s:L%(lineno)s: %(message)s'))
    logger.addHandler(c_handler)
    logger.addHandler(f_handler)
    

    so that:

    logger.debug('hi')
    

    will produce a logging record to the temporary file while producing no output to the console.

    Demo: https://replit.com/@blhsing1/SpryHeartfeltError