| @@ -18,11 +18,11 @@ class ILogger: | |||||
| level = 0 | level = 0 | ||||
| def __init__(self, msg): | def __init__(self, msg): | ||||
| return | return | ||||
| def warning(self, *args): | |||||
| def warning(self, *args, **kw): | |||||
| return | return | ||||
| def debug(self, *args): | |||||
| def debug(self, *args, **kw): | |||||
| return | return | ||||
| def error(self, *args): | |||||
| def error(self, *args, **kw): | |||||
| return | return | ||||
| def setLevel(cls, level): | def setLevel(cls, level): | ||||
| cls.level = level | cls.level = level | ||||
| @@ -38,27 +38,27 @@ class BasicLogger(ILogger): | |||||
| def __init__(self, msg, out=sys.stdout): | def __init__(self, msg, out=sys.stdout): | ||||
| self.msg, self.out = msg, out | self.msg, self.out = msg, out | ||||
| def warning(self, msg, *args): | |||||
| def warning(self, msg, *args, **kw): | |||||
| if self.warnOn() is False: return | if self.warnOn() is False: return | ||||
| if BasicLogger.last != self.msg: | if BasicLogger.last != self.msg: | ||||
| BasicLogger.last = self.msg | BasicLogger.last = self.msg | ||||
| print >>self, "---- ", self.msg, " ----" | print >>self, "---- ", self.msg, " ----" | ||||
| print >>self, " %s " %BasicLogger.WARN, | |||||
| print >>self, " %s " %self.WARN, | |||||
| print >>self, msg %args | print >>self, msg %args | ||||
| WARN = '[WARN]' | WARN = '[WARN]' | ||||
| def debug(self, msg, *args): | |||||
| def debug(self, msg, *args, **kw): | |||||
| if self.debugOn() is False: return | if self.debugOn() is False: return | ||||
| if BasicLogger.last != self.msg: | if BasicLogger.last != self.msg: | ||||
| BasicLogger.last = self.msg | BasicLogger.last = self.msg | ||||
| print >>self, "---- ", self.msg, " ----" | print >>self, "---- ", self.msg, " ----" | ||||
| print >>self, " %s " %BasicLogger.DEBUG, | |||||
| print >>self, " %s " %self.DEBUG, | |||||
| print >>self, msg %args | print >>self, msg %args | ||||
| DEBUG = '[DEBUG]' | DEBUG = '[DEBUG]' | ||||
| def error(self, msg, *args): | |||||
| def error(self, msg, *args, **kw): | |||||
| if BasicLogger.last != self.msg: | if BasicLogger.last != self.msg: | ||||
| BasicLogger.last = self.msg | BasicLogger.last = self.msg | ||||
| print >>self, "---- ", self.msg, " ----" | print >>self, "---- ", self.msg, " ----" | ||||
| print >>self, " %s " %BasicLogger.ERROR, | |||||
| print >>self, " %s " %self.ERROR, | |||||
| print >>self, msg %args | print >>self, msg %args | ||||
| ERROR = '[ERROR]' | ERROR = '[ERROR]' | ||||
| @@ -66,9 +66,29 @@ class BasicLogger(ILogger): | |||||
| '''Write convenience function; writes strings. | '''Write convenience function; writes strings. | ||||
| ''' | ''' | ||||
| for s in args: self.out.write(s) | for s in args: self.out.write(s) | ||||
| event = ''.join(*args) | |||||
| _LoggerClass = BasicLogger | _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): | class GLRecord(dict): | ||||
| """Grid Logging Best Practices Record, Distributed Logging Utilities | """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 | More info: http://www.cedps.net/wiki/index.php/LoggingBestPractices#Python | ||||
| reserved -- list of reserved names, | 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 | levels -- dict of levels and description | ||||
| """ | """ | ||||
| reserved = ('date', 'event', 'level', 'status', 'gid', 'prog') | reserved = ('date', 'event', 'level', 'status', 'gid', 'prog') | ||||
| omitname = ('date', 'event',) | |||||
| omitname = () | |||||
| levels = dict(FATAL='Component cannot continue, or system is unusable.', | levels = dict(FATAL='Component cannot continue, or system is unusable.', | ||||
| ALERT='Action must be taken immediately.', | ALERT='Action must be taken immediately.', | ||||
| CRITICAL='Critical conditions (on the system).', | CRITICAL='Critical conditions (on the system).', | ||||
| @@ -161,28 +181,46 @@ class GLRecord(dict): | |||||
| unicode:str, GLDate:str, } | unicode:str, GLDate:str, } | ||||
| def sendGridLog(**kw): | |||||
| def gridLog(**kw): | |||||
| """Send GLRecord, Distributed Logging Utilities | """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 | 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 | return | ||||
| url = os.environ.get('GRIDLOG_DEST') | url = os.environ.get('GRIDLOG_DEST') | ||||
| if url is None: | if url is None: | ||||
| return | return | ||||
| ## NOTE: urlparse problem w/customized schemes | |||||
| try: | 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: | 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(): | def setBasicLogger(): | ||||
| @@ -191,6 +229,11 @@ def setBasicLogger(): | |||||
| setLoggerClass(BasicLogger) | setLoggerClass(BasicLogger) | ||||
| BasicLogger.setLevel(0) | BasicLogger.setLevel(0) | ||||
| def setGridLogger(): | |||||
| '''Use GridLogger for all logging events. | |||||
| ''' | |||||
| setLoggerClass(GridLogger) | |||||
| def setBasicLoggerWARN(): | def setBasicLoggerWARN(): | ||||
| '''Use Basic Logger. | '''Use Basic Logger. | ||||
| ''' | ''' | ||||
| @@ -203,6 +246,10 @@ def setBasicLoggerDEBUG(): | |||||
| setLoggerClass(BasicLogger) | setLoggerClass(BasicLogger) | ||||
| BasicLogger.setLevel(DEBUG) | BasicLogger.setLevel(DEBUG) | ||||
| def setLoggerClass(loggingClass): | |||||
| '''Set Logging Class. | |||||
| ''' | |||||
| def setLoggerClass(loggingClass): | def setLoggerClass(loggingClass): | ||||
| '''Set Logging Class. | '''Set Logging Class. | ||||
| ''' | ''' | ||||