blob: 23b0f3ba4ff295e1c05864807eca2eb2b5810f00 [file] [log] [blame]
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +03001import logging
koder aka kdanilov962ee5f2016-12-19 02:40:08 +02002import logging.config
kdanylov aka koderb0833332017-05-13 20:39:17 +03003from typing import Callable
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +03004
5
koder aka kdanilov22d134e2016-11-08 11:33:19 +02006def color_me(color: int) -> Callable[[str], str]:
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +03007 RESET_SEQ = "\033[0m"
8 COLOR_SEQ = "\033[1;%dm"
9
10 color_seq = COLOR_SEQ % (30 + color)
11
12 def closure(msg):
13 return color_seq + msg + RESET_SEQ
14 return closure
15
16
17class ColoredFormatter(logging.Formatter):
18 BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = range(8)
19
20 colors = {
21 'WARNING': color_me(YELLOW),
22 'DEBUG': color_me(BLUE),
23 'CRITICAL': color_me(YELLOW),
24 'ERROR': color_me(RED)
25 }
26
koder aka kdanilov22d134e2016-11-08 11:33:19 +020027 def __init__(self, msg: str, use_color: bool=True, datefmt: str=None) -> None:
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030028 logging.Formatter.__init__(self, msg, datefmt=datefmt)
29 self.use_color = use_color
30
koder aka kdanilov22d134e2016-11-08 11:33:19 +020031 def format(self, record: logging.LogRecord) -> str:
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030032 orig = record.__dict__
33 record.__dict__ = record.__dict__.copy()
34 levelname = record.levelname
35
36 prn_name = levelname + ' ' * (8 - len(levelname))
37 if levelname in self.colors:
38 record.levelname = self.colors[levelname](prn_name)
39 else:
40 record.levelname = prn_name
41
42 # super doesn't work here in 2.6 O_o
43 res = logging.Formatter.format(self, record)
44
45 # res = super(ColoredFormatter, self).format(record)
46
47 # restore record, as it will be used by other formatters
48 record.__dict__ = orig
49 return res