Mercurial > kallithea
comparison pylons_app/lib/colored_formatter.py @ 153:a5a3bcc5ee89
Added colored formatter to project, and configs
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Sun, 16 May 2010 15:06:20 +0200 |
parents | |
children | 779dabcaae28 |
comparison
equal
deleted
inserted
replaced
152:0c00fbaff55a | 153:a5a3bcc5ee89 |
---|---|
1 #import logging | |
2 ## now we patch Python code to add color support to logging.StreamHandler | |
3 #def add_coloring_to_emit_windows(fn): | |
4 # # add methods we need to the class | |
5 # def _out_handle(self): | |
6 # import ctypes | |
7 # return ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE) | |
8 # out_handle = property(_out_handle) | |
9 # | |
10 # def _set_color(self, code): | |
11 # import ctypes | |
12 # # Constants from the Windows API | |
13 # self.STD_OUTPUT_HANDLE = -11 | |
14 # hdl = ctypes.windll.kernel32.GetStdHandle(self.STD_OUTPUT_HANDLE) | |
15 # ctypes.windll.kernel32.SetConsoleTextAttribute(hdl, code) | |
16 # | |
17 # setattr(logging.StreamHandler, '_set_color', _set_color) | |
18 # | |
19 # def new(*args): | |
20 # FOREGROUND_BLUE = 0x0001 # text color contains blue. | |
21 # FOREGROUND_GREEN = 0x0002 # text color contains green. | |
22 # FOREGROUND_RED = 0x0004 # text color contains red. | |
23 # FOREGROUND_INTENSITY = 0x0008 # text color is intensified. | |
24 # FOREGROUND_WHITE = FOREGROUND_BLUE|FOREGROUND_GREEN |FOREGROUND_RED | |
25 # # winbase.h | |
26 # STD_INPUT_HANDLE = -10 | |
27 # STD_OUTPUT_HANDLE = -11 | |
28 # STD_ERROR_HANDLE = -12 | |
29 # | |
30 # # wincon.h | |
31 # FOREGROUND_BLACK = 0x0000 | |
32 # FOREGROUND_BLUE = 0x0001 | |
33 # FOREGROUND_GREEN = 0x0002 | |
34 # FOREGROUND_CYAN = 0x0003 | |
35 # FOREGROUND_RED = 0x0004 | |
36 # FOREGROUND_MAGENTA = 0x0005 | |
37 # FOREGROUND_YELLOW = 0x0006 | |
38 # FOREGROUND_GREY = 0x0007 | |
39 # FOREGROUND_INTENSITY = 0x0008 # foreground color is intensified. | |
40 # | |
41 # BACKGROUND_BLACK = 0x0000 | |
42 # BACKGROUND_BLUE = 0x0010 | |
43 # BACKGROUND_GREEN = 0x0020 | |
44 # BACKGROUND_CYAN = 0x0030 | |
45 # BACKGROUND_RED = 0x0040 | |
46 # BACKGROUND_MAGENTA = 0x0050 | |
47 # BACKGROUND_YELLOW = 0x0060 | |
48 # BACKGROUND_GREY = 0x0070 | |
49 # BACKGROUND_INTENSITY = 0x0080 # background color is intensified. | |
50 # | |
51 # levelno = args[1].levelno | |
52 # if(levelno>=50): | |
53 # color = BACKGROUND_YELLOW | FOREGROUND_RED | FOREGROUND_INTENSITY | BACKGROUND_INTENSITY | |
54 # elif(levelno>=40): | |
55 # color = FOREGROUND_RED | FOREGROUND_INTENSITY | |
56 # elif(levelno>=30): | |
57 # color = FOREGROUND_YELLOW | FOREGROUND_INTENSITY | |
58 # elif(levelno>=20): | |
59 # color = FOREGROUND_GREEN | |
60 # elif(levelno>=10): | |
61 # color = FOREGROUND_MAGENTA | |
62 # else: | |
63 # color = FOREGROUND_WHITE | |
64 # args[0]._set_color(color) | |
65 # | |
66 # ret = fn(*args) | |
67 # args[0]._set_color( FOREGROUND_WHITE ) | |
68 # #print "after" | |
69 # return ret | |
70 # return new | |
71 # | |
72 #def add_coloring_to_emit_ansi(fn): | |
73 # # add methods we need to the class | |
74 # def new(*args): | |
75 # levelno = args[1].levelno | |
76 # if(levelno>=50): | |
77 # color = '\x1b[31m' # red | |
78 # elif(levelno>=40): | |
79 # color = '\x1b[31m' # red | |
80 # elif(levelno>=30): | |
81 # color = '\x1b[33m' # yellow | |
82 # elif(levelno>=20): | |
83 # color = '\x1b[32m' # green | |
84 # elif(levelno>=10): | |
85 # color = '\x1b[35m' # pink | |
86 # else: | |
87 # color = '\x1b[0m' # normal | |
88 # args[1].msg = color + args[1].msg + '\x1b[0m' # normal | |
89 # #print "after" | |
90 # return fn(*args) | |
91 # return new | |
92 # | |
93 #import platform | |
94 #if platform.system()=='Windows': | |
95 # # Windows does not support ANSI escapes and we are using API calls to set the console color | |
96 # logging.StreamHandler.emit = add_coloring_to_emit_windows(logging.StreamHandler.emit) | |
97 #else: | |
98 # # all non-Windows platforms are supporting ANSI escapes so we use them | |
99 # logging.StreamHandler.emit = add_coloring_to_emit_ansi(logging.StreamHandler.emit) | |
100 # #log = logging.getLogger() | |
101 # #log.addFilter(log_filter()) | |
102 # #//hdlr = logging.StreamHandler() | |
103 # #//hdlr.setFormatter(formatter()) | |
104 | |
105 import logging | |
106 | |
107 BLACK, RED, GREEN, YELLOW, BLUE, MAGENTA, CYAN, WHITE = xrange(30, 38) | |
108 | |
109 # Sequences | |
110 RESET_SEQ = "\033[0m" | |
111 COLOR_SEQ = "\033[1;%dm" | |
112 BOLD_SEQ = "\033[1m" | |
113 | |
114 COLORS = { | |
115 'CRITICAL': MAGENTA, # level 50 | |
116 'ERROR': RED, # level 40 | |
117 'WARNING': CYAN, # level 30 | |
118 'INFO': GREEN, # level 20 | |
119 'DEBUG': BLUE, # level 10 | |
120 } | |
121 | |
122 class ColorFormatter(logging.Formatter): | |
123 | |
124 def __init__(self, *args, **kwargs): | |
125 # can't do super(...) here because Formatter is an old school class | |
126 logging.Formatter.__init__(self, *args, **kwargs) | |
127 | |
128 def format(self, record): | |
129 """ | |
130 Changes record's levelname to use with COLORS enum | |
131 """ | |
132 | |
133 levelname = record.levelname | |
134 start = COLOR_SEQ % (COLORS[levelname]) | |
135 def_record = logging.Formatter.format(self, record) | |
136 end = RESET_SEQ | |
137 | |
138 colored_record = start + def_record + end | |
139 return colored_record | |
140 | |
141 logging.ColorFormatter = ColorFormatter |