Logging to zero or more destinations

Robert Kern robert.kern at gmail.com
Tue Jul 8 16:11:01 EDT 2008


samwyse wrote:
> In the Python 2.5 Library Reference, section 14.5.3 (Logging to
> multiple destinations), an example is given of logging to both a file
> and the console.  This is done by using logging.basicConfig() to
> configure a log file, and then calling
> logging.getLogger('').addHandler(console) to add the console.
> 
> However, in section 14.5.4 (Sending and receiving logging events
> across a network), a call is made to
> rootLogger.addHandler(socketHandler), and later it is stated that "On
> the client side, nothing is printed on the console".
> 
> Finally, back in section 14.5.2 (Basic example), it's stated that "by
> default, the root logger is configured to only handle messages with a
> severity of WARNING or above. The message format is also a
> configuration default, as is the output destination of the messages -
> sys.stderr."
> 
> The only way that I can see for all three statements to be consistent
> is that the root logger starts with an empty list of handlers, and
> doesn't instantiate a default handler until either
> logging.basicConfig()  is called, or the first time that a message is
> logged.  This would also seem to imply that there's no way to use an
> empty handler list (say, if you want to suppress all logging), because
> the root handler will instantiate a handler for you.  Is this correct?

Sort of. Your analysis of what happens is entirely correct (see below). However, 
a way to suppress all logging is to have a single Handler where the emit() 
method does nothing. Or you can set the level above CRITICAL.

$ python
Python 2.5.1 (r251:54869, Apr 18 2007, 22:08:04)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
 >>> import logging
 >>> logging.warn('foo')
WARNING:root:foo
 >>> logger = logging.getLogger()
 >>> logger.handlers
[<logging.StreamHandler instance at 0xb43788>]
 >>>

$ python
Python 2.5.1 (r251:54869, Apr 18 2007, 22:08:04)
[GCC 4.0.1 (Apple Computer, Inc. build 5367)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
 >>> import logging
 >>> logger = logging.getLogger()
 >>> logger.handlers
[]
 >>> logging.basicConfig()
 >>> logger.handlers
[<logging.StreamHandler instance at 0xb43788>]
 >>> logger.handlers = []
 >>> class NullHandler(logging.Handler):
...     def emit(self, record):
...         pass
...
 >>> logger.addHandler(NullHandler())
 >>> logging.warn('foo')
 >>>

> P.S.  I tried researching this further by myself, but the logging
> module doesn't come with source (apparently it's written in C?) and I
> don't have the time to find and download the source to my laptop.

No it's all Python. Look in c:\Python25\Lib\logging\ .

-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
  that is made terrible by our own mad attempt to interpret it as though it had
  an underlying truth."
   -- Umberto Eco




More information about the Python-list mailing list