#!/usr/bin/env python
import logging
def processArgs(self, *args):
msg = args[-1]
args = args[:-1]
# the following allows logging even in case of problems!
if not (len(args) == len(self.extras)):
noArgs = len(self.extras)
l = list(' ' * noArgs)
l[:len(args)] = args[:len(l)]
print "WARNING: wrong number of logging arguments"
args = l
extras = dict(zip(self.extras, args))
return (msg, extras)
def myLog(self, level, *args):
if self.isEnabledFor(level):
msg, extras = self.processArgs(*args)
self._log(level, msg, [], extra=extras)
def myDebug(self, *args):
self.log(logging.DEBUG, *args)
def myInfo(self, *args):
self.log(logging.INFO, *args)
def myWarning(self, *args):
self.log(logging.WARNING, *args)
def myError(self, *args):
self.log(logging.ERROR, *args)
def myCritical(self, *args):
self.log(logging.CRITICAL, *args)
def setLoggerExtras(logger, extras):
logger.extras = extras
logger.__class__.processArgs = processArgs
logger.__class__.log = myLog
logger.__class__.debug = myDebug
logger.__class__.info = myInfo
logger.__class__.warning = myWarning
logger.__class__.error = myError
logger.__class__.critical = myCritical
#-------------------------------------------------
if __name__ == '__main__':
import logging.handlers
def getRotFileLogger(name, filePath, maxBytes, maxCount,
logLevel=logging.DEBUG, format=None):
format = format or '%(asctime)s - %(levelname)s - %(message)s'
my_logger = logging.getLogger(name)
my_logger.setLevel(logLevel)
# Add the log message handler to the logger
handler = logging.handlers.RotatingFileHandler(
filePath, maxBytes=maxBytes, backupCount=maxCount)
formatter = logging.Formatter(format)
handler.setFormatter(formatter)
my_logger.addHandler(handler)
return my_logger
format = '%(asctime)s - %(levelname)s - %(extra1)s - %(extra2)s - %(message)s'
logger = getRotFileLogger('test', 'test.log', 1000, 10, format=format)
# simply set the extras
setLoggerExtras(logger, ['extra1', 'extra2'])
# and then log without explicit "extra" dict
logger.debug('xx1', 'xx2', 'debug')
logger.info('xx1', 'info') #missing arg
logger.warning('xx1', 'xx2', 'xx3', 'hello, a warning') #too many args
logger.error('some error')
logger.critical('some critical')