Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can INFO and DEBUG logging message be sent to stdout and higher level message to stderr

Tags:

python

logging

Is there an easy way with python's logging module to send messages with a DEBUG or INFO level and the one with a higher level to different streams?

Is it a good idea anyway?

like image 513
Dinoboff Avatar asked Feb 20 '10 13:02

Dinoboff


People also ask

What is the logging function for debug level?

debug() is used. By default, the root log level is WARN, so every log with lower level (for example via logging.info("info") ) will be ignored. Another particularity of the root logger is that its default handler will be created the first time a log with a level greater than WARN is logged.

How do I enable debug level logging?

Right-click on Debug under App Agent and select Enable Log.

What is the difference between debug and info logs?

INFO is used to log the information your program is working as expected. DEBUG is used to find the reason in case your program is not working as expected or an exception has occurred. it's in the interest of the developer.


1 Answers

import logging import sys  class LessThanFilter(logging.Filter):     def __init__(self, exclusive_maximum, name=""):         super(LessThanFilter, self).__init__(name)         self.max_level = exclusive_maximum      def filter(self, record):         #non-zero return means we log this message         return 1 if record.levelno < self.max_level else 0  #Get the root logger logger = logging.getLogger() #Have to set the root logger level, it defaults to logging.WARNING logger.setLevel(logging.NOTSET)  logging_handler_out = logging.StreamHandler(sys.stdout) logging_handler_out.setLevel(logging.DEBUG) logging_handler_out.addFilter(LessThanFilter(logging.WARNING)) logger.addHandler(logging_handler_out)  logging_handler_err = logging.StreamHandler(sys.stderr) logging_handler_err.setLevel(logging.WARNING) logger.addHandler(logging_handler_err)  #demonstrate the logging levels logger.debug('DEBUG') logger.info('INFO') logger.warning('WARNING') logger.error('ERROR') logger.critical('CRITICAL') 

Implementation aside, I do think it is a good idea to use the logging facilities in python to output to the terminal, in particular because you can add another handler to additionally log to a file. If you set stdout to be INFO instead of DEBUG, you can even include additional DEBUG information that the user wouldn't standardly see in the log file.

like image 116
Zoey Greer Avatar answered Sep 28 '22 02:09

Zoey Greer