forked from IdentityPython/pyFF
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlogs.py
86 lines (64 loc) · 2.47 KB
/
logs.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
86
__author__ = 'leifj'
import logging
import syslog
import cherrypy
def printable(s):
if isinstance(s, unicode):
return s.encode('utf8', errors='ignore').decode('utf8')
elif isinstance(s, str):
return s.decode("utf8", errors="ignore").encode('utf8')
else:
return repr(s)
class PyFFLogger(object):
def __init__(self):
self._loggers = {logging.WARN: logging.warn,
logging.WARNING: logging.warn,
logging.CRITICAL: logging.critical,
logging.INFO: logging.info,
logging.DEBUG: logging.debug,
logging.ERROR: logging.error}
def _l(self, severity, msg):
if '' in cherrypy.tree.apps:
cherrypy.tree.apps[''].log(printable(msg), severity=severity)
elif severity in self._loggers:
self._loggers[severity](printable(msg))
else:
raise ValueError("unknown severity %s" % severity)
def warn(self, msg):
return self._l(logging.WARN, msg)
def warning(self, msg):
return self._l(logging.WARN, msg)
def info(self, msg):
return self._l(logging.INFO, msg)
def error(self, msg):
return self._l(logging.ERROR, msg)
def critical(self, msg):
return self._l(logging.CRITICAL, msg)
def debug(self, msg):
return self._l(logging.DEBUG, msg)
def isEnabledFor(self, lvl):
return logging.getLogger(__name__).isEnabledFor(lvl)
log = PyFFLogger()
# http://www.aminus.org/blogs/index.php/2008/07/03/writing-high-efficiency-large-python-sys-1?blog=2
# blog post explicitly gives permission for use
class SysLogLibHandler(logging.Handler):
"""A logging handler that emits messages to syslog.syslog."""
priority_map = {
10: syslog.LOG_NOTICE,
20: syslog.LOG_NOTICE,
30: syslog.LOG_WARNING,
40: syslog.LOG_ERR,
50: syslog.LOG_CRIT,
0: syslog.LOG_NOTICE,
}
def __init__(self, facility):
if type(facility) is str or type(facility) is unicode:
nf = getattr(syslog, "LOG_%s" % facility.upper(), None)
if not isinstance(nf, int):
raise ValueError('Invalid log facility: %s' % nf)
self.facility = nf
else:
self.facility = facility
logging.Handler.__init__(self)
def emit(self, record):
syslog.syslog(self.facility | self.priority_map[record.levelno], self.format(record))