I’m a fan of the internal Python logging module and recently I’ve run into the need to remove some information from all log output in a system at work, and a custom Handler or a Filter just wouldn’t do.

Fortunately it’s rather easy to modify the behavior of logging.Logger.

>>> import logging
>>> import sys
>>> class CustomLogger(logging.getLoggerClass()):
...     def makeRecord(self, name, level, fn, lno, msg, args, exc_info, func=None, extra=None):
...         msg += ' adding stuff'
...         return super(CustomLogger, self).makeRecord(name, level, fn, lno, msg, args, exc_info, func=func, extra=extra)
... 
>>> logger = CustomLogger(__name__)
>>> handler = logging.StreamHandler(sys.stdout)
>>> logger.addHandler(handler)
>>> logger.error('Halp')
Halp adding stuff
>>>

Notice we subclass from logging.getLoggerClass() as this will return the most recently modified instance of Logger – otherwise the base Logger class; that’s important if you want to allow other libraries, or the framework you may be using, to also modify its behavior.

I’ll let this be a teaser. Next post will be a tutorial type post on the logging module in Python – to warm you up a bit to the concept, posts afterwards will hack up logging in ever useful ways.


comments powered by Disqus