|
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.
|