[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.python

Re: logging: local functions ==> loss of lineno

Jean-Michel Pichavant

3/11/2010 10:44:00 AM

Hellmut Weber wrote:
> Hi Vinay Sajip,
> I'm very glad discoverd your logging module ;-)
> (That's what I would have liked 25 years ago when I was working as a
> technical software developper!)
>
> Now I'm writing just some personal tools, I like python and want to
> use logging on a regular basis.
>
> Logging works very well giving the filename and line number of the
> point where it is called. As long as I use the loggers directly.
> BUT when I have to wrap the logger call in some other function, I
> always get file name and line number of the call of the logger inside
> the wrapping function.
>
> Is there a possibility to get this information in this situation too?
>
> TIA
>
> Hellmut
>
You have to specify the file and line number by yourself, the logging
feature can only assume that you want the line number of the logger call.

i.e.

in test.py:

import logging
import inspect

_logger = logging.getLogger(__name__)

class Foo:
def __init__(self):
self._logger = _logger

def info(self, msg):
previousFrame = inspect.currentframe().f_back
self._logger.info(msg,
extra={'custom_lineno':previousFrame.f_lineno, 'custom_filename':
previousFrame.f_code.co_filename})

if __name__ == '__main__':
_logger.handlers=[]
_logger.addHandler(logging.StreamHandler())
_logger.handlers[-1].setFormatter(logging.Formatter('file
%(custom_filename)s line %(custom_lineno)d : %(message)s'))
_logger.setLevel(logging.DEBUG)
foo = Foo()
foo.info('a foo info')

In [3]: run test.py
file test.py line 20 : a foo info


note that you cannot override the logging builtin 'lineno' key with the
extra dictionary, that is why I'm using the 'custom_lineno' key. I don't
know why the logger forbids it though, would have been nice to override
lineno without the need of adding a new key.

JM