From: <bov...@us...> - 2006-05-02 20:18:23
|
Revision: 1199 Author: boverhof Date: 2006-05-02 13:18:18 -0700 (Tue, 02 May 2006) ViewCVS: http://svn.sourceforge.net/pywebsvcs/?rev=1199&view=rev Log Message: ----------- M logging.py -- added debugOn and warnOn methods Modified Paths: -------------- trunk/wstools/logging.py Modified: trunk/wstools/logging.py =================================================================== --- trunk/wstools/logging.py 2006-05-02 20:16:22 UTC (rev 1198) +++ trunk/wstools/logging.py 2006-05-02 20:18:18 UTC (rev 1199) @@ -7,7 +7,10 @@ ident = "$Id$" import sys +WARN = 1 +DEBUG = 2 + class ILogger: '''Logger interface, by default this class will be used and logging calls are no-ops. @@ -24,6 +27,10 @@ def setLevel(cls, level): cls.level = level setLevel = classmethod(setLevel) + + debugOn = lambda self: self.level >= DEBUG + warnOn = lambda self: self.level >= WARN + _LoggerClass = ILogger @@ -33,16 +40,16 @@ def warning(self, msg, *args): if self.level < 1: return - print >>self, self.WARN, self.msg, + print >>self, BasicLogger.WARN, self.msg, print >>self, msg %args WARN = 'WARN' def debug(self, msg, *args): if self.level < 2: return - print >>self, self.DEBUG, self.msg, + print >>self, BasicLogger.DEBUG, self.msg, print >>self, msg %args DEBUG = 'DEBUG' def error(self, msg, *args): - print >>self, self.ERROR, self.msg, + print >>self, BasicLogger.ERROR, self.msg, print >>self, msg %args ERROR = 'ERROR' @@ -62,13 +69,13 @@ '''Use Basic Logger. ''' setLoggerClass(BasicLogger) - BasicLogger.setLevel(1) + BasicLogger.setLevel(WARN) def setBasicLoggerDEBUG(): '''Use Basic Logger. ''' setLoggerClass(BasicLogger) - BasicLogger.setLevel(2) + BasicLogger.setLevel(DEBUG) def setLoggerClass(loggingClass): '''Set Logging Class. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bov...@us...> - 2006-05-02 23:26:05
|
Revision: 1202 Author: boverhof Date: 2006-05-02 16:26:00 -0700 (Tue, 02 May 2006) ViewCVS: http://svn.sourceforge.net/pywebsvcs/?rev=1202&view=rev Log Message: ----------- M logging.py -- use debugOn w/i "debug" to test if should log event. Modified Paths: -------------- trunk/wstools/logging.py Modified: trunk/wstools/logging.py =================================================================== --- trunk/wstools/logging.py 2006-05-02 23:23:20 UTC (rev 1201) +++ trunk/wstools/logging.py 2006-05-02 23:26:00 UTC (rev 1202) @@ -31,20 +31,18 @@ debugOn = lambda self: self.level >= DEBUG warnOn = lambda self: self.level >= WARN -_LoggerClass = ILogger - class BasicLogger(ILogger): def __init__(self, msg, out=sys.stdout): self.msg, self.out = msg, out def warning(self, msg, *args): - if self.level < 1: return + if self.warnOn() is False: return print >>self, BasicLogger.WARN, self.msg, print >>self, msg %args WARN = 'WARN' def debug(self, msg, *args): - if self.level < 2: return + if self.debugOn() is False: return print >>self, BasicLogger.DEBUG, self.msg, print >>self, msg %args DEBUG = 'DEBUG' @@ -58,6 +56,7 @@ ''' for s in args: self.out.write(s) +_LoggerClass = BasicLogger def setBasicLogger(): '''Use Basic Logger. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bov...@us...> - 2006-05-03 00:13:59
|
Revision: 1204 Author: boverhof Date: 2006-05-02 17:13:47 -0700 (Tue, 02 May 2006) ViewCVS: http://svn.sourceforge.net/pywebsvcs/?rev=1204&view=rev Log Message: ----------- M logging.py -- make log records more readable. Modified Paths: -------------- trunk/wstools/logging.py Modified: trunk/wstools/logging.py =================================================================== --- trunk/wstools/logging.py 2006-05-03 00:13:20 UTC (rev 1203) +++ trunk/wstools/logging.py 2006-05-03 00:13:47 UTC (rev 1204) @@ -33,23 +33,34 @@ class BasicLogger(ILogger): + last = '' + def __init__(self, msg, out=sys.stdout): self.msg, self.out = msg, out def warning(self, msg, *args): if self.warnOn() is False: return - print >>self, BasicLogger.WARN, self.msg, + if BasicLogger.last != self.msg: + BasicLogger.last = self.msg + print >>self, "---- ", self.msg, " ----" + print >>self, " %s " %BasicLogger.WARN, print >>self, msg %args - WARN = 'WARN' + WARN = '[WARN]' def debug(self, msg, *args): if self.debugOn() is False: return - print >>self, BasicLogger.DEBUG, self.msg, + if BasicLogger.last != self.msg: + BasicLogger.last = self.msg + print >>self, "---- ", self.msg, " ----" + print >>self, " %s " %BasicLogger.DEBUG, print >>self, msg %args - DEBUG = 'DEBUG' + DEBUG = '[DEBUG]' def error(self, msg, *args): - print >>self, BasicLogger.ERROR, self.msg, + if BasicLogger.last != self.msg: + BasicLogger.last = self.msg + print >>self, "---- ", self.msg, " ----" + print >>self, " %s " %BasicLogger.ERROR, print >>self, msg %args - ERROR = 'ERROR' + ERROR = '[ERROR]' def write(self, *args): '''Write convenience function; writes strings. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bov...@us...> - 2007-05-18 23:02:54
|
Revision: 1382 http://svn.sourceforge.net/pywebsvcs/?rev=1382&view=rev Author: boverhof Date: 2007-05-18 16:02:54 -0700 (Fri, 18 May 2007) Log Message: ----------- M logging.py -- updates Modified Paths: -------------- trunk/wstools/logging.py Modified: trunk/wstools/logging.py =================================================================== --- trunk/wstools/logging.py 2007-05-16 22:16:35 UTC (rev 1381) +++ trunk/wstools/logging.py 2007-05-18 23:02:54 UTC (rev 1382) @@ -18,11 +18,11 @@ 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 @@ 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,10 +66,30 @@ '''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 @@ 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,36 +181,59 @@ 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(): '''Use Basic Logger. ''' setLoggerClass(BasicLogger) BasicLogger.setLevel(0) +def setGridLogger(): + '''Use GridLogger for all logging events. + ''' + setLoggerClass(GridLogger) + def setBasicLoggerWARN(): '''Use Basic Logger. ''' @@ -206,6 +249,10 @@ def setLoggerClass(loggingClass): '''Set Logging Class. ''' + +def setLoggerClass(loggingClass): + '''Set Logging Class. + ''' assert issubclass(loggingClass, ILogger), 'loggingClass must subclass ILogger' global _LoggerClass _LoggerClass = loggingClass This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bov...@us...> - 2007-06-05 05:46:45
|
Revision: 1389 http://svn.sourceforge.net/pywebsvcs/?rev=1389&view=rev Author: boverhof Date: 2007-06-04 22:46:46 -0700 (Mon, 04 Jun 2007) Log Message: ----------- M logging.py Modified Paths: -------------- trunk/wstools/logging.py Modified: trunk/wstools/logging.py =================================================================== --- trunk/wstools/logging.py 2007-06-05 04:48:41 UTC (rev 1388) +++ trunk/wstools/logging.py 2007-06-05 05:46:46 UTC (rev 1389) @@ -105,7 +105,7 @@ end: Immediately after the last action in a task (that succeeded). error: an error condition that does not correspond to an end event. - date -- timestamp + ts -- timestamp level -- logging level (see levels below) status -- integer status code gid -- global grid identifier @@ -116,10 +116,10 @@ More info: http://www.cedps.net/wiki/index.php/LoggingBestPractices#Python reserved -- list of reserved names, - omitname -- list of reserved names, output only values ('date', 'event',) + omitname -- list of reserved names, output only values ('ts', 'event',) levels -- dict of levels and description """ - reserved = ('date', 'event', 'level', 'status', 'gid', 'prog') + reserved = ('ts', 'event', 'level', 'status', 'gid', 'prog') omitname = () levels = dict(FATAL='Component cannot continue, or system is unusable.', ALERT='Action must be taken immediately.', @@ -133,7 +133,7 @@ ) def __init__(self, date=None, **kw): - kw['date'] = date or self.GLDate() + kw['ts'] = date or self.GLDate() dict.__init__(self, kw) def __str__(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bov...@us...> - 2007-06-14 06:37:45
|
Revision: 1394 http://svn.sourceforge.net/pywebsvcs/?rev=1394&view=rev Author: boverhof Date: 2007-06-13 23:37:47 -0700 (Wed, 13 Jun 2007) Log Message: ----------- M logging.py -- add processID to log messages Modified Paths: -------------- trunk/wstools/logging.py Modified: trunk/wstools/logging.py =================================================================== --- trunk/wstools/logging.py 2007-06-12 18:45:39 UTC (rev 1393) +++ trunk/wstools/logging.py 2007-06-14 06:37:47 UTC (rev 1394) @@ -5,7 +5,7 @@ # """Logging""" ident = "$Id$" -import sys +import os, sys WARN = 1 DEBUG = 2 @@ -134,6 +134,7 @@ def __init__(self, date=None, **kw): kw['ts'] = date or self.GLDate() + kw['gid'] = kw.get('gid') or os.getpid() dict.__init__(self, kw) def __str__(self): This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bov...@us...> - 2007-05-03 22:43:43
|
Revision: 1376 http://svn.sourceforge.net/pywebsvcs/?rev=1376&view=rev Author: boverhof Date: 2007-05-03 15:43:39 -0700 (Thu, 03 May 2007) Log Message: ----------- M logging.py -- added function for distributed logging Modified Paths: -------------- trunk/wstools/logging.py Modified: trunk/wstools/logging.py =================================================================== --- trunk/wstools/logging.py 2007-04-27 16:32:50 UTC (rev 1375) +++ trunk/wstools/logging.py 2007-05-03 22:43:39 UTC (rev 1376) @@ -69,6 +69,122 @@ _LoggerClass = BasicLogger + +class GLRecord(dict): + """Grid Logging Best Practices Record, Distributed Logging Utilities + + The following names are reserved: + + event -- log event name + Below is EBNF for the event name part of a log message. + name = <nodot> ( "." <name> )? + nodot = {RFC3896-chars except "."} + + Suffixes: + start: Immediately before the first action in a task. + end: Immediately after the last action in a task (that succeeded). + error: an error condition that does not correspond to an end event. + + date -- timestamp + level -- logging level (see levels below) + status -- integer status code + gid -- global grid identifier + gid, cgid -- parent/child identifiers + prog -- program name + + + More info: http://www.cedps.net/wiki/index.php/LoggingBestPractices#Python + + reserved -- list of reserved names, + omitname -- list of reserved names, output only values + levels -- dict of levels and description + """ + reserved = ('date', 'event', 'level', 'status', 'gid', 'prog') + omitname = ('date', 'event',) + levels = dict(FATAL='Component cannot continue, or system is unusable.', + ALERT='Action must be taken immediately.', + CRITICAL='Critical conditions (on the system).', + ERROR='Errors in the component; not errors from elsewhere.', + WARNING='Problems that are recovered from, usually.', + NOTICE='Normal but significant condition.', + INFO='Informational messages that would be useful to a deployer or administrator.', + DEBUG='Lower level information concerning program logic decisions, internal state, etc.', + TRACE='Finest granularity, similar to "stepping through" the component or system.', + ) + + def __init__(self, date=None, **kw): + kw['date'] = date or self.GLDate() + dict.__init__(self, kw) + + def __str__(self): + """ + """ + from cStringIO import StringIO + s = StringIO(); n = " " + reserved = self.reserved; omitname = self.omitname; levels = self.levels + + for k in ( list(filter(lambda i: self.has_key(i), reserved)) + + list(filter(lambda i: i not in reserved, self.keys())) + ): + v = self[k] + if k in omitname: + s.write( "%s " %self.format[type(v)](v) ) + continue + + if k == reserved[2] and v not in levels: + pass + + s.write( "%s=%s " %(k, self.format[type(v)](v) ) ) + + s.write("\n") + return s.getvalue() + + class GLDate(str): + """Grid logging Date Format + all timestamps should all be in the same time zone (UTC). + Grid timestamp value format that is a highly readable variant of the ISO8601 time standard [1]: + + YYYY-MM-DDTHH:MM:SS.SSSSSSZ + + """ + def __new__(self, args=None): + """args -- datetime (year, month, day[, hour[, minute[, second[, microsecond[,tzinfo]]]]]) + """ + import datetime + args = args or datetime.datetime.utcnow() + l = (args.year, args.month, args.day, args.hour, args.minute, args.second, + args.microsecond, args.tzinfo or 'Z') + + return str.__new__(self, "%04d-%02d-%02dT%02d:%02d:%02d.%06d%s" %l) + + format = { int:str, float:lambda x: "%lf" % x, long:str, str:lambda x:x, + unicode:str, GLDate:str, } + + +def sendGridLog(**kw): + """Send GLRecord, Distributed Logging Utilities + """ + import os + from socket import socket, AF_INET, SOCK_DGRAM + if not bool(os.environ.get('GRIDLOG_ON', False)): + return + + url = os.environ.get('GRIDLOG_DEST') + if url is None: + return + + 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)),) + except Exception, ex: + print >>sys.stderr, "*** gridlog failed -- %s" %(str(kw)) + + def setBasicLogger(): '''Use Basic Logger. ''' This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <bov...@us...> - 2007-06-14 06:49:33
|
Revision: 1395 http://svn.sourceforge.net/pywebsvcs/?rev=1395&view=rev Author: boverhof Date: 2007-06-13 23:49:35 -0700 (Wed, 13 Jun 2007) Log Message: ----------- M logging.py -- little fix Modified Paths: -------------- trunk/wstools/logging.py Modified: trunk/wstools/logging.py =================================================================== --- trunk/wstools/logging.py 2007-06-14 06:37:47 UTC (rev 1394) +++ trunk/wstools/logging.py 2007-06-14 06:49:35 UTC (rev 1395) @@ -193,7 +193,7 @@ """ import os - if not bool( os.environ.get('GRIDLOG_ON', False) ): + if not bool( int(os.environ.get('GRIDLOG_ON', 0)) ): return url = os.environ.get('GRIDLOG_DEST') This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |