Search code examples
pythonloggingpython-logging

How to use modern string formatting options with Python's logging module?


The Python logging tutorial says that the newer ways of formatting are beyond the scope of the tutorial, without mentioning where to learn about it.

I would appreciate any examples or link to documentation that allow me to use .format() style message formatting in logging calls such as debug(), info(), etc.


Solution

  • Recently, I was looking for that too. I think I got pointed to the solution here on SO, but I only have the final url at hand. This is what I do:

    # http://plumberjack.blogspot.de/2010/10/supporting-alternative-formatting.html
    class BraceMessage(object):
        def __init__(self, fmt, *args, **kwargs):
            self.fmt = fmt
            self.args = args
            self.kwargs = kwargs
    
        def __str__(self):
            return self.fmt.format(*self.args, **self.kwargs)
    
    _F = BraceMessage
    

    Can be used like this:

    logger.debug(_F("foo {0} {quux}", bar, quux=baz))
    

    The formatting will only take place in the very moment the message is evaluated, so you don't lose lots of performance if a log level is disabled. The author of that snippet above made this (and some other utilities) available as a package: logutils.