Skip to content

Commit

Permalink
Add a FingersCrossedHandler that does not forward records until a war…
Browse files Browse the repository at this point in the history
…ning or higher occurs.
  • Loading branch information
birkenfeld committed Jul 23, 2010
1 parent 395e41f commit 8db9d0c
Show file tree
Hide file tree
Showing 2 changed files with 63 additions and 1 deletion.
38 changes: 38 additions & 0 deletions logbook/more.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
"""
logbook.more
~~~~~~~~~~~~
Fancy stuff for logbook.
:copyright: (c) 2010 by Armin Ronacher, Georg Brandl.
:license: BSD, see LICENSE for more details.
"""

from logbook.base import Logger, NOTSET, WARNING
from logbook.handlers import Handler


class FingersCrossedHandler(Handler):
def __init__(self, handler, action_level=WARNING):
Handler.__init__(self)
self._level = action_level
self._handler = handler
self._records = []
self._seen_error = False

def contextbound(self, processor=None, bubble=True):
del self._records[:]
self._seen_error = False
return Handler.contextbound(self, processor, bubble)

def emit(self, record):
if self._seen_error:
return self._handler.emit(record)
elif record.level >= self._level:
for old_record in self._records:
self._handler.emit(old_record)
self._handler.emit(record)
self._seen_error = True
else:
self._records.append(record)
26 changes: 25 additions & 1 deletion test_logbook.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import string
from random import randrange
from calendar import timegm
from time import mktime
from itertools import izip
from contextlib import contextmanager
from cStringIO import StringIO
Expand Down Expand Up @@ -327,5 +326,30 @@ def test_basic_compat(self):
in captured.getvalue())


class MoreTestCase(LogbookTestCase):

def test_fingerscrossed(self):
from logbook.more import FingersCrossedHandler

orig_handler = logbook.handlers.StderrHandler()
handler = FingersCrossedHandler(orig_handler, logbook.WARNING)

# if no warning occurs, the infos are not logged
with handler.contextbound(bubble=False):
with capture_stderr() as captured:
self.log.info('some info')
self.assertEquals(captured.getvalue(), '')

# but if it does, all log messages are output
with handler.contextbound(bubble=False):
with capture_stderr() as captured:
self.log.info('some info')
self.log.warning('something happened')
logs = captured.getvalue()
self.assert_('some info' in logs)
self.assert_('something happened' in logs)



if __name__ == '__main__':
unittest.main()

0 comments on commit 8db9d0c

Please sign in to comment.