diff --git a/logging.py b/logging.py index 6166de1..aed6313 100644 --- a/logging.py +++ b/logging.py @@ -18,11 +18,11 @@ class ILogger: level = 0 def __init__(self, msg): return - def warning(self, *args): + def warning(self, *args, **kw): return - def debug(self, *args): + def debug(self, *args, **kw): return - def error(self, *args): + def error(self, *args, **kw): return def setLevel(cls, level): cls.level = level @@ -38,27 +38,27 @@ class BasicLogger(ILogger): def __init__(self, msg, out=sys.stdout): self.msg, self.out = msg, out - def warning(self, msg, *args): + def warning(self, msg, *args, **kw): if self.warnOn() is False: return if BasicLogger.last != self.msg: BasicLogger.last = self.msg print >>self, "---- ", self.msg, " ----" - print >>self, " %s " %BasicLogger.WARN, + print >>self, " %s " %self.WARN, print >>self, msg %args WARN = '[WARN]' - def debug(self, msg, *args): + def debug(self, msg, *args, **kw): if self.debugOn() is False: return if BasicLogger.last != self.msg: BasicLogger.last = self.msg print >>self, "---- ", self.msg, " ----" - print >>self, " %s " %BasicLogger.DEBUG, + print >>self, " %s " %self.DEBUG, print >>self, msg %args DEBUG = '[DEBUG]' - def error(self, msg, *args): + def error(self, msg, *args, **kw): if BasicLogger.last != self.msg: BasicLogger.last = self.msg print >>self, "---- ", self.msg, " ----" - print >>self, " %s " %BasicLogger.ERROR, + print >>self, " %s " %self.ERROR, print >>self, msg %args ERROR = '[ERROR]' @@ -66,9 +66,29 @@ class BasicLogger(ILogger): '''Write convenience function; writes strings. ''' for s in args: self.out.write(s) + event = ''.join(*args) + _LoggerClass = BasicLogger +class GridLogger(ILogger): + def debug(self, msg, *args, **kw): + kw['component'] = self.msg + gridLog(event=msg %args, level='DEBUG', **kw) + + def warning(self, msg, *args, **kw): + kw['component'] = self.msg + gridLog(event=msg %args, level='WARNING', **kw) + + def error(self, msg, *args, **kw): + kw['component'] = self.msg + gridLog(event=msg %args, level='ERROR', **kw) + + +# +# Registry of send functions for gridLog +# +GLRegistry = {} class GLRecord(dict): """Grid Logging Best Practices Record, Distributed Logging Utilities @@ -96,11 +116,11 @@ class GLRecord(dict): More info: http://www.cedps.net/wiki/index.php/LoggingBestPractices#Python reserved -- list of reserved names, - omitname -- list of reserved names, output only values + omitname -- list of reserved names, output only values ('date', 'event',) levels -- dict of levels and description """ reserved = ('date', 'event', 'level', 'status', 'gid', 'prog') - omitname = ('date', 'event',) + omitname = () levels = dict(FATAL='Component cannot continue, or system is unusable.', ALERT='Action must be taken immediately.', CRITICAL='Critical conditions (on the system).', @@ -161,28 +181,46 @@ class GLRecord(dict): unicode:str, GLDate:str, } -def sendGridLog(**kw): +def gridLog(**kw): """Send GLRecord, Distributed Logging Utilities + If the scheme is passed as a keyword parameter + the value is expected to be a callable function + that takes 2 parameters: url, outputStr + + GRIDLOG_ON -- turn grid logging on + GRIDLOG_DEST -- provide URL destination """ import os - from socket import socket, AF_INET, SOCK_DGRAM - if not bool(os.environ.get('GRIDLOG_ON', False)): + + if not bool( os.environ.get('GRIDLOG_ON', False) ): return url = os.environ.get('GRIDLOG_DEST') if url is None: return + ## NOTE: urlparse problem w/customized schemes try: - idx1 = url.find('://') + 3 - idx2 = url.find('/', idx1) - if idx2 < idx1: idx2 = len(url) - netloc = url[idx1:idx2] - host,port = (netloc.split(':')+[80])[0:2] - socket(AF_INET, SOCK_DGRAM).sendto( str(GLRecord(**kw)), - (host,int(port)),) + scheme = url[:url.find('://')] + send = GLRegistry[scheme] + send( url, str(GLRecord(**kw)), ) except Exception, ex: - print >>sys.stderr, "*** gridlog failed -- %s" %(str(kw)) + print >>sys.stderr, "*** gridLog failed -- %s" %(str(kw)) + + +def sendUDP(url, outputStr): + from socket import socket, AF_INET, SOCK_DGRAM + idx1 = url.find('://') + 3; idx2 = url.find('/', idx1) + if idx2 < idx1: idx2 = len(url) + netloc = url[idx1:idx2] + host,port = (netloc.split(':')+[80])[0:2] + socket(AF_INET, SOCK_DGRAM).sendto( outputStr, (host,int(port)), ) + +def writeToFile(url, outputStr): + print >> open(url.split('://')[1], 'a+'), outputStr + +GLRegistry["gridlog-udp"] = sendUDP +GLRegistry["file"] = writeToFile def setBasicLogger(): @@ -191,6 +229,11 @@ def setBasicLogger(): setLoggerClass(BasicLogger) BasicLogger.setLevel(0) +def setGridLogger(): + '''Use GridLogger for all logging events. + ''' + setLoggerClass(GridLogger) + def setBasicLoggerWARN(): '''Use Basic Logger. ''' @@ -203,6 +246,10 @@ def setBasicLoggerDEBUG(): setLoggerClass(BasicLogger) BasicLogger.setLevel(DEBUG) +def setLoggerClass(loggingClass): + '''Set Logging Class. + ''' + def setLoggerClass(loggingClass): '''Set Logging Class. '''