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