<br><font size=2 face="Courier New">I found that the configuration system
of the new logging package of Python 2.3 has some </font>
<br><font size=2 face="Courier New">unintuitive idiosyncracies that are
worth mentioning because they can cost you quite some </font>
<br><font size=2 face="Courier New">development time and are not documented
elsewhere.</font>
<br>
<br><font size=2 face="Courier New">I used the logging configuration file
shown below. My aim was to log only the INFO messages,</font>
<br><font size=2 face="Courier New">but log DEBUG messages for one particular
module (called webTestLogin.py).</font>
<br>
<br><font size=2 face="Courier New">Here's what I found out:</font>
<br><font size=2 face="Courier New">- if your init logging in your module
with the line</font>
<br><font size=2 face="Courier New">        log
= logging.getLogger()</font>
<br><font size=2 face="Courier New">  then the logging module will
determine the module where the call originated and in your log files</font>
<br><font size=2 face="Courier New">  you'll find lines like</font>
<br><font size=2 face="Courier New">        2004-01-26
11:21:15,890 [INFO] creating ticket for this session [in webtestlogin]<br>
  where webTestLogin mysteriously lost its capitalization. Now, this
does *not* mean that</font>
<br><font size=2 face="Courier New">  webtestlogin will also be the
'qualname', i.e. the name of a channel that you can use</font>
<br><font size=2 face="Courier New">  to log messages from this module
to a different place or in a different manner; for that</font>
<br><font size=2 face="Courier New">  to work, you'll need the following
line of code:</font>
<br><font size=2 face="Courier New">        log
= logging.getLogger('webtestlogin')</font>
<br><font size=2 face="Courier New">  (making 'webtestlogin' a channel,
or some sort of logical logging unit that allow its calls to be handled</font>
<br><font size=2 face="Courier New">  differently from the other log
calls in your program).</font>
<br><font size=2 face="Courier New">  The documentation says qualname
is the 'fully qualified name', but doesn't contend on what</font>
<br><font size=2 face="Courier New">  that is; I tried the complete
package name, that didn't work ('com.cellzome.pandora.webTestLogin').</font>
<br><font size=2 face="Courier New">- capitalization *is* very important;
if you use lowercase in the code, you'll need lowercase</font>
<br><font size=2 face="Courier New">  in the logging config file as
well (see the qualname line below)</font>
<br><font size=2 face="Courier New">- 'propagate' forwards log messages
to other loggers, so you may e.g. log the same line to</font>
<br><font size=2 face="Courier New">  two different places - so far
so good. But: If you set propagate to 1 in the [logger_webtestlogin]</font>
<br><font size=2 face="Courier New">  shown below, the root logger
will log DEBUG messages too, even though it was told to log</font>
<br><font size=2 face="Courier New">  only INFO - just because the
message has been forwarded (?!?)</font>
<br><font size=2 face="Courier New">  Generally I think that propagation
follows the order of the loggers, but I still don't get the</font>
<br><font size=2 face="Courier New">  complete picture.</font>
<br><font size=2 face="Courier New">- the config file scanner/parser is
not very robust; if you use spaces in a list for aesthetic reasons</font>
<br><font size=2 face="Courier New">  (e.g. keys=root, webtestlogin)
the key list will be ('root', ' webtestlogin'). This can produce</font>
<br><font size=2 face="Courier New">  quite esoteric errors :-)</font>
<br>
<br><font size=2 face="Courier New">Maybe I didn't get the point/purpose
of the framework on some of those issues, but</font>
<br><font size=2 face="Courier New">then again it might be worth to extend
the existing documentation a bit.</font>
<br><font size=2 face="Courier New"><br>
Cheers,</font>
<br><font size=2 face="Courier New"><br>
Robert F Schmitt, Cellzome AG<br>
Meyerhofstr. 1, D-69117 Heidelberg, Germany<br>
Tel + 49 6221 137 57 405, Fax + 49 6221 137 57 202<br>
www.cellzome.de<br>
------------------------------------------------------------------------------------<br>
The vast majority of our imports come from outside the country."<br>
- George W. Bush<br>
<br>
"If we don't succeed, we run the risk of failure."<br>
- George W. Bush<br>
</font>
<br><font size=2 face="Courier New">///////////////////////////////////////////////////////////////////</font>
<br><font size=2 face="Courier New">///////////////      
           config file  
                ///////////////</font>
<br><font size=2 face="Courier New">///////////////////////////////////////////////////////////////////</font>
<br>
<br><font size=2 face="Courier New">###########################################################</font>
<br><font size=2 face="Courier New"># general references</font>
<br>
<br><font size=2 face="Courier New">[loggers]</font>
<br><font size=2 face="Courier New">keys=root,webtestlogin</font>
<br>
<br><font size=2 face="Courier New">[handlers]</font>
<br><font size=2 face="Courier New">keys=drogenHandler,stdoutHandler</font>
<br>
<br><font size=2 face="Courier New">[formatters]</font>
<br><font size=2 face="Courier New">keys=taschenFormat,textOnlyFormat</font>
<br>
<br><font size=2 face="Courier New">###########################################################</font>
<br><font size=2 face="Courier New"># loggers</font>
<br>
<br><font size=2 face="Courier New">[logger_webtestlogin]</font>
<br><font size=2 face="Courier New">level=DEBUG</font>
<br><font size=2 face="Courier New">handlers=drogenHandler,stdoutHandler</font>
<br><font size=2 face="Courier New">propagate=0</font>
<br><font size=2 face="Courier New">qualname=webtestlogin</font>
<br>
<br><font size=2 face="Courier New">[logger_root]</font>
<br><font size=2 face="Courier New">level=INFO</font>
<br><font size=2 face="Courier New">handlers=drogenHandler,stdoutHandler</font>
<br><font size=2 face="Courier New">propagate=1</font>
<br>
<br><font size=2 face="Courier New">###########################################################</font>
<br><font size=2 face="Courier New"># handlers</font>
<br>
<br><font size=2 face="Courier New">[handler_drogenHandler]</font>
<br><font size=2 face="Courier New">class=FileHandler</font>
<br><font size=2 face="Courier New">level=NOTSET</font>
<br><font size=2 face="Courier New">formatter=taschenFormat</font>
<br><font size=2 face="Courier New">args=('pandora.log', 'w')</font>
<br>
<br><font size=2 face="Courier New">[handler_stdoutHandler]</font>
<br><font size=2 face="Courier New">class=StreamHandler</font>
<br><font size=2 face="Courier New">level=INFO</font>
<br><font size=2 face="Courier New">formatter=textOnlyFormat</font>
<br><font size=2 face="Courier New">args=(sys.stdout,)</font>
<br>
<br><font size=2 face="Courier New">###########################################################</font>
<br><font size=2 face="Courier New"># formatters</font>
<br>
<br><font size=2 face="Courier New">[formatter_taschenFormat]</font>
<br><font size=2 face="Courier New">format=%(asctime)s [%(levelname)s]
%(message)s [in %(module)s]</font>
<br>
<br><font size=2 face="Courier New">[formatter_textOnlyFormat]</font>
<br><font size=2 face="Courier New">format=%(levelname)s %(message)s</font>
<br>
<br>