472,111 Members | 1,935 Online
Bytes | Software Development & Data Engineering Community
Post +

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 472,111 software developers and data experts.

Logging to zero or more destinations

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?

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.

Thanks!
Jul 8 '08 #1
4 1532
samwyse <sa*****@gmail.comwrites:
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,
That is correct.
or the first time that a message is
logged.
That is not correct. The list of handlers is empty until `basicConfig`
or explicit `addHandler` is called.
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?
No. Consider this:
>>import logging
logging.root.warning('error message')
No handlers could be found for logger "root"
>>logging.root.warning('error message')
Note only one warning message.

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.
Hmmm... that's strange. It is a pure Python package.

$ ls /usr/lib/python2.5/logging/
config.py config.pyc handlers.py handlers.pyc __init__.py __init__.pyc

HTH,
Rob
Jul 8 '08 #2
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

Jul 8 '08 #3
Rob Wolfe wrote:
samwyse <sa*****@gmail.comwrites:
>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,

That is correct.
>or the first time that a message is
logged.

That is not correct. The list of handlers is empty until `basicConfig`
or explicit `addHandler` is called.
>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?

No. Consider this:
>>>import logging
logging.root.warning('error message')
No handlers could be found for logger "root"
>>>logging.root.warning('error message')

Note only one warning message.
Ah, right. It is the module-level functions logging.warn(), etc. that invoke
basicConfig() if no handler is present.

--
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

Jul 8 '08 #4
On Jul 8, 3:01*pm, Rob Wolfe <r...@smsnet.plwrote:
samwyse <samw...@gmail.comwrites:
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.

Hmmm... that's strange. It is a pure Python package.

$ ls /usr/lib/python2.5/logging/
config.py *config.pyc *handlers.py *handlers.pyc *__init__.py *__init__.pyc

HTH,
Rob
Oops, my bad. I was using IDLE and tried the "Open Module..." command
on logging, not logging.something.
Jul 9 '08 #5

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

12 posts views Thread by Rob Cranfill | last post: by
reply views Thread by Michael CATANZARITI | last post: by
2 posts views Thread by chuck | last post: by
2 posts views Thread by nyhetsgrupper | last post: by
17 posts views Thread by Cramer | last post: by
6 posts views Thread by McA | last post: by
reply views Thread by leo001 | last post: by

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.