On 16/01/2012 23:21, Vinay Sajip wrote:

Why is this? There must be some rationale for this rather than what, for me and

others I've talked to, would seem more natural, ie: a filter on the root
logger would get messages both logged to it and any messages propagated to it
from child loggers to process.

Perhaps you're right, but this can't be changed without breaking existing code, 
AFAICT.

How breaking code? Configuration, maybe, but I can't see anyone being upset that filtering would begin working "the same as everything else".
This just feels like a bug...

  However, if you find your usage pattern occurring very commonly in your
applications, it's easy enough to create a DelegatingHandler handler class
which passes its events on to any number of handlers you like.

But this is just extra work when the normal built-in
delegation-upwards-ending-in-root works exactly as I want.

It's not in general useful to filter on message content, when one factors in 
use of third-party libraries.

Actually, the filter I want to work on (log_nerf) is precisely for 3rd party libraries; if a library author thinks a message should be error but you think it should be debug, and vice versa, having a filter that alters the level is the only way to sort things out without hacking the 3rd party library. I've also seen this technique used successfully where the filter looks to a database for config and nerfs messages during a certain time period.

Of course, if you are in control in the whole software stack you're using, or 
in certain very specific scenarios, it may be more useful - but in general it's 
most useful to filter on level and using logger names. The __name__ for loggers 
is useful to locate the source of events to a module, but you can have child 
loggers under that to log specific types of events in that module, and use the 
verbosity of those sub-module loggers to control output.

Again, this doesn't help if the __name__-ish loggers are in third party packages that you don't want to have to fork ;-)

It's also the opposite of what I'd need, I'd need to plug one
handler into all the specific loggers that get used (and bear in mind that many
libraries log to __name__ from modules and sub-modules) this is a pretty onerous
task :-(

I thought from an earlier comment - "rather than just the root logger where my 
handlers live" - that you had your handlers attached to the root logger, in which 
case it wouldn't be onerous at all. In place of those individual handlers attached to the 
root, you simply attach your DelegatingHandler to the root logger, and attach the filter 
and the other handlers to that DelegatingHandler instance.

Both use cases are valid, and a DelegatingHandler just feels like a hack to work around a deficiency in the framework...

cheers,

Chris

--
Simplistix - Content Management, Batch Processing & Python Consulting
            - http://www.simplistix.co.uk
--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to