Custom log handler and logging.config.fileConfig()

Lowell Alleman lowell at allemansonline.com
Wed May 28 16:53:56 EDT 2008


Here is the situation:  I wrote my own log handler class (derived from
logging.Handler) and I want to be able to use it from a logging config
file, that is, a config file loaded with the
logging.config.fileConfig() function.

Let say my logging class is called "MyLogHandler" and it's in a module
called "mylogmodule", I want to be able to make an entry something
like this in my logging config file:

   [handler_hand02]
   class=mylogmodule.MyLogHandler
   level=DEBUG
   formatter=form02
   args=('python.log', 10, True)

I did some digging in the code and documentation, and it doesn't
appear that this question of writing and accessing your own log
handlers is addressed.  As per the logging/config.py code, it looks
like the actual file handler classes are being grabbed using an "eval"
from the "logging" module's namespace, like so:
   klass = eval(klass, vars(logging))

So this basically means that I have to mess with the "logging"
module's namespace if I want this to work, right?  So I've come up
with a couple of options, but I'm trying to figure out what approach
is best:

Option 1:  Require the client (the user of my logging module), first
import my module and then copy it into the logging module's namespace,
before calling  fileConfig().  Something like this:

    import mylogmodule
    import logging
    logging.mylogmodule = mylogmodule

Option 2:  Have my module make a copy MyLogHandler class into the
logging (or logging.handlers) module, and then let the client use it
from their directly.  They client would still have to load my logging
class first (which isn't any different they what they would have to do
if they wanted to use the extended log handlers form the
logging.handlers module)

My module would include:
    import logging
    class MyLogHandler(logging.Handler):
        ...
    logging.MyLogHandler = MyLogHandler

The config file would simply have:
    class=MyLogHandler


Option 3:   Is there an easy (and non-evil) way for me to make my
module available as "logging.mylogmodule" directly?  I am using
setuptools, and it seems like what I've read about "namespaces", they
do something close to what I'm looking for, but I think that requires
that all of the "__init__.py"s involved be empty (or have some special
namespace declaration code).  The __init__.py for the logging module
is not at all empty, so I suppose that rules out this option?  Anyone
have some insights on this?


Thanks in advance,

- Lowell Alleman



More information about the Python-list mailing list