This repository was archived by the owner on Nov 25, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlogger.py
128 lines (93 loc) · 3.26 KB
/
logger.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#!/usr/bin/env python3
import logging
import traceback
import sys, os, io, selectors
import re
# from: https://stackoverflow.com/a/38662876
def strip_ansi(line):
ansi_escape = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
return ansi_escape.sub('', line)
# cool custom color logging
class ColorLog(object):
def __init__(self, logger):
self._log = logger
def _log_msg(self, name, *args, **kwargs):
return getattr(self._log, 'fatal' if name == 'exception' else name)(self._format_msg(name, *args, **kwargs))
def _format_msg(self, name, *args, **kwargs):
exc_info = kwargs.get('exc_info', False)
if name == 'exception':
name = 'fatal'
exc_info = True
elif name == 'warn':
name = 'warning'
elif name == 'critical':
name = 'fatal'
_colored = colored if kwargs.get('use_ansi', True) else lambda s, x : s
prompt = prompts[name] + ' ' if not kwargs.get('prompt') else kwargs.get('prompt')
message = _colored(prompt, colormap[name]) + ''.join([_colored(x, colormap[name]) for x in args])
if exc_info:
exception = traceback.format_exc().strip()
prompt = '... ' if not kwargs.get('prompt') else kwargs.get('prompt')
message += '\n' + '\n'.join([
prompt + _colored(x, colormap['exception']) for x in exception.split('\n')
])
return message
def __getattr__(self, name):
if name in ['debug', 'info', 'warn', 'warning', 'error', 'critical', 'fatal', 'exception']:
return lambda *args, **kwargs : self._log_msg(name, *args, **kwargs)
return getattr(self._log, name)
colored = lambda message, attrs = [] : colors['reset'] + ''.join([colors[x] for x in attrs]) + str(message) + colors['reset']
colored_command = lambda message : colors['bold'] + colors['underline'] + str(message) + colors['reset']
colormap = {
'debug' : ['italics', 'gray'],
'info' : ['blue'],
'warning' : ['bold', 'darkorange'],
'error' : ['bold', 'lightred'],
'fatal' : ['bg_red', 'bold_white'],
'exception' : ['italics', 'darkred']
}
prompts = {
'debug' : ' * ',
'info' : '[*]',
'warn' : '[!]',
'warning' : '[!]',
'error' : '[-]',
'fatal' : '[-]'
}
log_levels = {
'debug' : logging.DEBUG,
'info' : logging.INFO,
'warn' : logging.WARNING,
'warning' : logging.WARNING,
'error' : logging.ERROR,
'critical' : logging.CRITICAL,
'fatal' : logging.FATAL
}
colors = {
'lightgray' : '\033[37m',
'darkgray' : '\033[90m',
'gray' : '\033[2m',
'blue' : '\033[34m',
'green' : '\033[32m',
'cyan' : '\033[36m',
'darkorange' : '\033[33m',
'darkred' : '\033[31m',
'lightred' : '\033[91m',
'red' : '\033[91m',
'yellow' : '\033[33m',
'lightyellow' : '\033[93m',
'lightgreen' : '\033[92m',
'bold_white' : '\033[1;37m',
'bg_red' : '\033[41m',
'italics' : '\033[3m',
'bold' : '\033[01m',
'underline' : '\033[04m',
'reset' : '\033[0m'
}
LOG_LEVEL = logging.DEBUG
log = ColorLog(logging.getLogger(__name__))
log.setLevel(LOG_LEVEL)
stdout = logging.StreamHandler()
log.addHandler(stdout)
stdout.setLevel(LOG_LEVEL)
logging = log # XXX: find a cleaner solution plz