logging: local functions ==> loss of lineno

Jean-Michel Pichavant jeanmichel at sequans.com
Thu Mar 11 11:44:22 CET 2010

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?
> 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.


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
extra={'custom_lineno':previousFrame.f_lineno, 'custom_filename': 

if __name__ == '__main__':
%(custom_filename)s line %(custom_lineno)d : %(message)s'))
    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.


More information about the Python-list mailing list