author | Radek Brich <radek.brich@devl.cz> |
Sat, 13 Apr 2013 15:24:47 +0200 | |
changeset 5 | 055f7dfb3e4f |
parent 2 | d3ffa15f5886 |
child 10 | 51b7e98e1f41 |
permissions | -rw-r--r-- |
2
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
1 |
import logging |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
2 |
from copy import copy |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
3 |
|
5
055f7dfb3e4f
Refactor ansicolor, add demo.
Radek Brich <radek.brich@devl.cz>
parents:
2
diff
changeset
|
4 |
from pycolib.ansicolor import highlight, BOLD, WHITE, YELLOW, RED |
2
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
5 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
6 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
7 |
class ColoredFormatter(logging.Formatter): |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
8 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
9 |
def __init__(self, fmt, datefmt): |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
10 |
logging.Formatter.__init__(self, fmt, datefmt) |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
11 |
self._colors = { |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
12 |
'message': { |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
13 |
'default': (None, None), |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
14 |
'exception': (BOLD + YELLOW, RED), |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
15 |
}, |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
16 |
'levelname': { |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
17 |
'default': (BOLD + WHITE, None), |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
18 |
'debug': (None, None), |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
19 |
}, |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
20 |
'time': { |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
21 |
'default': (BOLD + WHITE, None), |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
22 |
'debug': (None, None), |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
23 |
}, |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
24 |
} |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
25 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
26 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
27 |
def formatTime(self, record, datefmt=None): |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
28 |
"""Override, add color as specified.""" |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
29 |
formatted = logging.Formatter.formatTime(self, record, datefmt) |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
30 |
fg, bg = self.get_color('time', record) |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
31 |
if fg or bg: |
5
055f7dfb3e4f
Refactor ansicolor, add demo.
Radek Brich <radek.brich@devl.cz>
parents:
2
diff
changeset
|
32 |
formatted = highlight(1, fg, bg) + formatted + highlight(0) |
2
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
33 |
return formatted |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
34 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
35 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
36 |
def format(self, record): |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
37 |
"""Override, add color as specified.""" |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
38 |
original_record = copy(record) |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
39 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
40 |
### message color |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
41 |
fg, bg = self.get_color('message', record) |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
42 |
if fg or bg: |
5
055f7dfb3e4f
Refactor ansicolor, add demo.
Radek Brich <radek.brich@devl.cz>
parents:
2
diff
changeset
|
43 |
record.msg = highlight(1, fg, bg) + record.msg + highlight(0) |
2
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
44 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
45 |
### levelname color |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
46 |
fg, bg = self.get_color('levelname', record) |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
47 |
if fg or bg: |
5
055f7dfb3e4f
Refactor ansicolor, add demo.
Radek Brich <radek.brich@devl.cz>
parents:
2
diff
changeset
|
48 |
record.levelname = highlight(1, fg, bg) + record.levelname + highlight(0) |
2
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
49 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
50 |
res = logging.Formatter.format(self, record) |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
51 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
52 |
record = original_record |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
53 |
return res |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
54 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
55 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
56 |
def set_color(self, fieldname, levelname, fg=None, bg=None): |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
57 |
"""Specify color for parts of log message. |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
58 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
59 |
Args: |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
60 |
fieldname: Which field to apply: 'message' | 'levelname' | 'time' |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
61 |
levelname: Log level to apply, case insensitive: 'debug' | 'info' etc. |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
62 |
Custom levels are supported too. |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
63 |
Special name 'default' is used for unspecified levels. |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
64 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
65 |
""" |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
66 |
self._colors[fieldname][levelname.lower()] = (fg, bg) |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
67 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
68 |
|
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
69 |
def get_color(self, fieldname, record): |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
70 |
"""Get specified color for field levelname (from record).""" |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
71 |
colormap = self._colors[fieldname] |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
72 |
levelname = record.levelname.lower() |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
73 |
fg, bg = colormap['default'] |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
74 |
if levelname in colormap: |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
75 |
fg, bg = colormap[levelname] |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
76 |
# exception is not real level, detect it using exc_info |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
77 |
if record.levelno == logging.ERROR and record.exc_info is not None \ |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
78 |
and 'exception' in colormap: |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
79 |
fg, bg = colormap['exception'] |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
80 |
return fg, bg |
d3ffa15f5886
Add ColoredFormatter. Add setup.py.
Radek Brich <radek.brich@devl.cz>
parents:
diff
changeset
|
81 |