Python: Custom Logging Across All Modules
Task I have a collection of scripts and I'd like them to produce unified logging messages with minimum alterations to modules doing logging the actual messages. I've written a smal
Solution 1:
If you want to change root logger you could just use getLogger()
everywhere, with no arguments.
Regarding the instance setup only in the main module, you can instantiate your logger, add your own Handler, and use it in all the other submodules (as I did bellow).
I created a class that inherits the StreamHandler in custom_logger.py
:
class MyHandler(logging.StreamHandler):
def __init__(self):
logging.StreamHandler.__init__(self)
fmt = '%(asctime)s %(filename)-18s %(levelname)-8s: %(message)s'
fmt_date = '%Y-%m-%dT%T%Z'
formatter = logging.Formatter(fmt, fmt_date)
self.setFormatter(formatter)
Then, in submodule.py
, I put the getLogger after the imports and commented it in the methods:
import sys
import logging
log = logging.getLogger('root')
class SubClass(object):
def __init__(self):
log.info('message from SubClass / __init__')
def SomeMethod(self):
log.info('message from SubClass / SomeMethod')
Then, in app.py I created a Logger instance (that will be the same in all modules) and added my handler, which formats the output:
#!/usr/bin/python
import logging
import custom_logger
import submodule
log = logging.getLogger('root')
log.setLevel('DEBUG')
log.addHandler(custom_logger.MyHandler())
log.debug('debug message')
log.info('info message')
log.warning('warning message')
log.error('error message')
a = submodule.SubClass() # this should produce a log message
a.SomeMethod() # so should this
Output:
./app.py
2013-04-08T15:20:05EEST app.py DEBUG : debug message
2013-04-08T15:20:05EEST app.py INFO : info message
2013-04-08T15:20:05EEST app.py WARNING : warning message
2013-04-08T15:20:05EEST app.py ERROR : error message
2013-04-08T15:20:05EEST submodule.py INFO : message from SubClass / __init__
2013-04-08T15:20:05EEST submodule.py INFO : message from SubClass / SomeMethod
Post a Comment for "Python: Custom Logging Across All Modules"