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