Using logging module for conditional nested logs

Jean-Michel Pichavant jeanmichel at sequans.com
Thu Nov 5 05:10:33 EST 2009


Reckoner wrote:
> On Nov 4, 1:30 pm, Vinay Sajip <vinay_sa... at yahoo.co.uk> wrote:
>   
>> On Nov 4, 7:40 pm, Reckoner <recko... at gmail.com> wrote:
>>
>>
>>
>>     
>>> I hope that made some sense.
>>>       
>> Not especially :-(
>>
>> Sorry I don't understand exactly what you mean, because I find your
>> terminology confusing. For example, "logger that is attached to foo2"
>> - loggers are not attached to functions. "It responds to the 'root'
>> logger" - what responds? What's meant by "respond"?
>>
>> Loggers correspond to specific code components in an application.
>> Normally these areas are modules and sometimes they're classes.
>>
>> You can certainly treat functions as areas but this will typically
>> become unwieldy in any sizeable application. It doesn't (in general)
>> make sense to have a specific logger for foo1 for use only when it's
>> called by foo2. These seem like anti-patterns to me.
>>
>> Handlers are attached to loggers to make events logged via those
>> loggers available to different audiences - via console, file, email
>> etc.
>>
>> If you want to log that foo1 is being called by foo2, you can do this.
>> For example, you could have a utility function which walks (a
>> sufficient part of) the call stack to see the function call hierarchy,
>> then log this as additional information (e.g. using the 'extra'
>> parameter to the logging call). You can attach Filters to loggers and
>> handlers which use this information to decide where and whether to
>> actually record the event.
>>
>> As well as the Python logging documentation, you may also find the
>> following link useful:
>>
>> http://plumberjack.blogspot.com/2009/09/python-logging-101.html
>>
>> Regards,
>>
>> Vinay Sajip
>>     
>
> I appreciate your patience, as I am new to this.
>
> Your comments have put me on the right track. I will look at the link
> you specify.
>
> Thanks again.
>   

_foo2Logger = None

def foo2():
    global _foo2Logger
    _foo2Logger = whateverLogger
    foo1()


def foo1():
    foo1Logger = logging.getLogger(_foo2Logger.name + '.foo1') # this is 
how you can "attach" dynamically a logger to another
    foo1Logger.info('')



But for all the reasons expressed by Vinay, you don't want to do that.

Jean-Michel



More information about the Python-list mailing list