Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Replace default handler of Python logger

Tags:

python

logging

I've got the following code running on each request of a wsgi (web2py) application:

import logging, logging.handlers from logging import StreamHandler, Formatter  def get_configured_logger(name):      logger = logging.getLogger(name)      if (len(logger.handlers) == 0):         # This logger has no handlers, so we can assume it hasn't yet been configured (Django uses similiar trick)          # === Configure logger ===          # Create Formatted StreamHandler:         FORMAT = "%(process)s %(thread)s: %(message)s"         formatter = logging.Formatter(fmt=FORMAT)         handler = logging.StreamHandler()         handler.setFormatter(formatter)         logger.addHandler(handler)         logger.setLevel(logging.DEBUG)         logger.debug('CONFIGURING LOGGER')      return logger  # Get app specific logger: logger = get_configured_logger(request.application) logger.debug("TEST") 

It's meant to configure the logger once, with the formatted handler I want. It works, except that I'm getting double entries in my stdout:

81893 4329050112: CONFIGURING LOGGER DEBUG:dummy:CONFIGURING LOGGER 81893 4329050112: TEST DEBUG:dummy:TEST 

How do I use my new formatted handler and get rid of/hide the default one?

like image 489
Yarin Avatar asked Aug 05 '12 21:08

Yarin


People also ask

What is logger handler Python?

Python Logging Handler The log handler is the component that effectively writes/displays a log: Display it in the console (via StreamHandler), in a file (via FileHandler), or even by sending you an email via SMTPHandler, etc. Each log handler has 2 important fields: A formatter which adds context information to a log.

What is the default logging level in Python?

The default level is WARNING , which means that only events of this level and above will be tracked, unless the logging package is configured to do otherwise. Events that are tracked can be handled in different ways. The simplest way of handling tracked events is to print them to the console.

Is logging a default Python library?

Python provides a logging system as a part of its standard library, so you can quickly add logging to your application.


2 Answers

Perhaps the following example will help. Basically you can either remove the handlers of the logger you'd like to disable, or don't propagate with the logger you are logging from.

$ cat testlog.py import logging logging.basicConfig(filename='foo', level=logging.DEBUG) root_logger = logging.getLogger() root_logger.debug('bar')  my_logger = logging.getLogger('my_logger') FORMAT = "%(process)s %(thread)s: %(message)s" formatter = logging.Formatter(fmt=FORMAT) handler = logging.StreamHandler() handler.setFormatter(formatter)  my_logger.addHandler(handler) my_logger.setLevel(logging.DEBUG) my_logger.info('baz')  my_logger.propagate = False my_logger.info('foobar')  my_logger.propagate = True my_logger.info('foobaz') root_logger.handlers = [] my_logger.info('barbaz')  $ python testlog.py 5927 140735224465760: baz 5927 140735224465760: foobar 5927 140735224465760: foobaz 5927 140735224465760: barbaz  $ cat foo DEBUG:root:bar INFO:my_logger:baz INFO:my_logger:foobaz 
like image 114
Derek Litz Avatar answered Sep 21 '22 12:09

Derek Litz


You can remove the default handler from the getLogger() using this:

logging.getLogger().removeHandler(logging.getLogger().handlers[0]) 

Or clear the existing handlers first before adding handlers that you want:

logging.getLogger().handlers.clear() 

After doing so, these logs will no longer display except the new handlers you have added:

DEBUG: Do stuff WARNING: Do stuff 
like image 31
Chester Ayala Avatar answered Sep 19 '22 12:09

Chester Ayala