Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Re: Making a logging handler that produces context.

Reply
Thread Tools

Re: Making a logging handler that produces context.

 
 
Peter Otten
Guest
Posts: n/a
 
      01-14-2013
Antoon Pardon wrote:

> I have some in house code for which I am considering replacing the
> logging code with something that uses the logging module.


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


It turns out the logic of the above is correct. The problem is that the
handler has to see the INFO-level records while the filter() method has to
reject them. The following configuration seems to achieve that:

import logging
from collections import deque

class ContextStreamHandler(logging.StreamHandler):
def __init__(self, stream=None, context=5):
self.record_queue = deque([], context + 1)
logging.StreamHandler.__init__(self, stream)
def handle(self, record):
rv = self.filter(record)
self.record_queue.append(record)
if rv:
self.acquire()
try:
for record in self.record_queue:
self.emit(record)
self.record_queue.clear()
finally:
self.release()
return rv

class LevelFilter(logging.Filter):
def __init__(self, level, name=""):
logging.Filter.__init__(self, name)
self._filter_level = level
def filter(self, record):
return record.levelno >= self._filter_level

if __name__ == "__main__":
root = logging.getLogger()
root.setLevel(logging.INFO)

handler = ContextStreamHandler(context=2)
handler.addFilter(LevelFilter(logging.WARN))

root.addHandler(handler)

for i in range(20):
if i % 5:
root.info("message #%d" % i)
else:
root.warn("MESSAGE #%d" % i)


 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
problem in running a basic code in python 3.3.0 that includes HTML file Satabdi Mukherjee Python 1 04-04-2013 07:48 PM
Re: Making a logging handler that produces context. Antoon Pardon Python 0 01-14-2013 02:26 PM
Making a logging handler that produces context. Antoon Pardon Python 0 01-14-2013 11:03 AM
Removing default logging handler (causes duplicate logging) Gal Aviel Python 1 03-04-2008 03:35 PM
OutputStream from a URLConnection produces an OutOfMemory OutputStream from a URLConnection produces an OutOfMemory WinstonSmith_101@hotmail.com Java 2 10-25-2006 04:45 PM



Advertisments
 



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57