-
-
Notifications
You must be signed in to change notification settings - Fork 8
Expand file tree
/
Copy pathloggers.py
More file actions
60 lines (41 loc) · 1.86 KB
/
loggers.py
File metadata and controls
60 lines (41 loc) · 1.86 KB
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
"""Logging plugins for magicbus."""
import datetime
import sys
from magicbus.plugins import SimplePlugin
class StreamLogger(SimplePlugin):
default_format = '[%(timestamp)s] (Bus %(bus)s) %(message)s\n'
def __init__(self, bus, stream, level=None, format=None, encoding='utf-8'):
SimplePlugin.__init__(self, bus)
self.stream = stream
self.level = level
self.format = format or self.default_format
self.encoding = encoding
def log(self, msg, level):
if self.level is None or self.level <= level:
params = {
'timestamp': datetime.datetime.now().isoformat().encode('ISO-8859-1'),
'bus': self.bus.id,
'message': msg,
'level': level
}
complete_msg = self.format % params
if isinstance(complete_msg, bytes):
encoding = 'utf-8' if self.encoding is None else self.encoding
complete_msg = complete_msg.decode(encoding)
self.stream.write(complete_msg)
self.stream.flush()
class StdoutLogger(StreamLogger):
def __init__(self, bus, level=None, format=None, encoding='utf-8'):
StreamLogger.__init__(self, bus, sys.stdout, level, format, encoding)
class StderrLogger(StreamLogger):
def __init__(self, bus, level=None, format=None, encoding='utf-8'):
StreamLogger.__init__(self, bus, sys.stderr, level, format, encoding)
class FileLogger(StreamLogger):
def __init__(self, bus, filename=None, file=None,
level=None, format=None, encoding='utf8'):
self.filename = filename
if file is None:
if filename is None:
raise ValueError('Either file or filename MUST be supplied.')
file = open(filename, 'ab')
StreamLogger.__init__(self, bus, file, level, format, encoding)