A
Antoon Pardon
I have some in house code for which I am considering replacing the
logging code
with something that uses the logging module.
The code is typically used as a cron job with everything higher than
info logged to
a file and everything higher than warning logged to stderr.
However there is one thing the in-house log code does, that seems
difficult to do
with the logging module, provide some context. The in-house handlers
give the
possibilty to specify the number of lines of context the hander can provide.
So the following code:
Logger(fn = "file.log", level = info)
Logger(fl = stderr, level = warning, context = 2)
log(INFO, "line 1")
log(INFO, "line 2")
log(INFO, "line 3")
log(INFO, "line 4")
log(WARNING, "line 5")
Will sent something like the following lines to stderr:
INFO: line 3
INFO: line 4
WARNING: line 5
I tried the code below, but that produced the same
as the ordinary StreamHandler.
class ContextStreamHandler (StreamHandler):
def __init__(self, stream=None, context = 5):
self.recqueue = deque([], context)
StreamHandler.__init__(self, stream)
#__init__
def handle(self, record):
print("CONTEXT HANDLER")
rv = self.filter(record)
if rv:
self.acquire()
try:
for rec in self.recqueue:
self.emit(rec)
self.recqueue.clear()
self.emit(record)
finally:
self.release
else:
self.recqueue.append(record)
return rv
#handle
#ContextStreamHandler
logging code
with something that uses the logging module.
The code is typically used as a cron job with everything higher than
info logged to
a file and everything higher than warning logged to stderr.
However there is one thing the in-house log code does, that seems
difficult to do
with the logging module, provide some context. The in-house handlers
give the
possibilty to specify the number of lines of context the hander can provide.
So the following code:
Logger(fn = "file.log", level = info)
Logger(fl = stderr, level = warning, context = 2)
log(INFO, "line 1")
log(INFO, "line 2")
log(INFO, "line 3")
log(INFO, "line 4")
log(WARNING, "line 5")
Will sent something like the following lines to stderr:
INFO: line 3
INFO: line 4
WARNING: line 5
I tried the code below, but that produced the same
as the ordinary StreamHandler.
class ContextStreamHandler (StreamHandler):
def __init__(self, stream=None, context = 5):
self.recqueue = deque([], context)
StreamHandler.__init__(self, stream)
#__init__
def handle(self, record):
print("CONTEXT HANDLER")
rv = self.filter(record)
if rv:
self.acquire()
try:
for rec in self.recqueue:
self.emit(rec)
self.recqueue.clear()
self.emit(record)
finally:
self.release
else:
self.recqueue.append(record)
return rv
#handle
#ContextStreamHandler