/
more.py
85 lines (68 loc) · 2.52 KB
/
more.py
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# -*- coding: utf-8 -*-
"""
logbook.more
~~~~~~~~~~~~
Fancy stuff for logbook.
:copyright: (c) 2010 by Armin Ronacher, Georg Brandl.
:license: BSD, see LICENSE for more details.
"""
import sys
from logbook.base import LogRecord, Logger, NOTSET, WARNING
from logbook.handlers import Handler
class TaggingLogger(Logger):
def __init__(self, name=None, *tags):
Logger.__init__(self, name)
# create a method for each tag named
list(setattr(self, tag, lambda msg, *args, **kwargs:
self.log(tag, msg, *args, **kwargs)) for tag in tags)
def log(self, tags, msg, *args, **kwargs):
if isinstance(tags, basestring):
tags = [tags]
exc_info = kwargs.pop('exc_info', None)
extra = kwargs.pop('extra', {})
extra['tags'] = list(tags)
record = LogRecord(self.name, NOTSET, msg, args, kwargs, exc_info,
extra, sys._getframe(1))
self.process_record(record)
try:
self.handle(record)
finally:
record.close()
class TaggingHandler(Handler):
def __init__(self, **handlers):
Handler.__init__(self)
assert isinstance(handlers, dict)
self._handlers = dict(
(tag, isinstance(handler, Handler) and [handler] or handler)
for (tag, handler) in handlers.iteritems())
def emit(self, record):
for tag in record.extra['tags']:
for handler in self._handlers.get(tag, []):
handler.emit(record)
class FingersCrossedHandler(Handler):
"""This handler wraps another handler and will log everything in
memory until a certain level is exceeded.
"""
def __init__(self, handler, action_level=WARNING,
pull_information=True):
Handler.__init__(self)
self._level = action_level
self._handler = handler
self._records = []
self._pull_information = pull_information
self._action_triggered = False
def enqueue(self, record):
if self._pull_information:
record.pull_information()
self._records.append(record)
def emit(self, record):
if self._action_triggered:
return self._handler.emit(record)
elif record.level >= self._level:
for old_record in self._records:
self._handler.emit(old_record)
del self._records[:]
self._handler.emit(record)
self._action_triggered = True
else:
self.enqueue(record)