Show More
@@ -0,0 +1,69 b'' | |||
|
1 | # -*- coding: utf-8 -*- | |
|
2 | ||
|
3 | # Copyright (C) 2010-2016 RhodeCode GmbH | |
|
4 | # | |
|
5 | # This program is free software: you can redistribute it and/or modify | |
|
6 | # it under the terms of the GNU Affero General Public License, version 3 | |
|
7 | # (only), as published by the Free Software Foundation. | |
|
8 | # | |
|
9 | # This program is distributed in the hope that it will be useful, | |
|
10 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | |
|
11 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
|
12 | # GNU General Public License for more details. | |
|
13 | # | |
|
14 | # You should have received a copy of the GNU Affero General Public License | |
|
15 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | |
|
16 | # | |
|
17 | # This program is dual-licensed. If you wish to learn more about the | |
|
18 | # AppEnlight Enterprise Edition, including its added features, Support | |
|
19 | # services, and proprietary license terms, please see | |
|
20 | # https://rhodecode.com/licenses/ | |
|
21 | ||
|
22 | import json | |
|
23 | import logging | |
|
24 | ||
|
25 | ignored_keys = ['args', 'asctime', 'created', 'exc_info', 'exc_text', | |
|
26 | 'filename', 'funcName', 'levelname', 'levelno', 'lineno', | |
|
27 | 'message', 'module', 'msecs', 'msg', 'name', 'pathname', | |
|
28 | 'process', 'processName', 'relativeCreated', 'stack_info', | |
|
29 | 'thread', 'threadName'] | |
|
30 | ||
|
31 | ||
|
32 | class JSONFormatter(logging.Formatter): | |
|
33 | def format(self, record): | |
|
34 | """ | |
|
35 | Format the specified record as text. | |
|
36 | ||
|
37 | The record's attribute dictionary is used as the operand to a | |
|
38 | string formatting operation which yields the returned string. | |
|
39 | Before formatting the dictionary, a couple of preparatory steps | |
|
40 | are carried out. The message attribute of the record is computed | |
|
41 | using LogRecord.getMessage(). If the formatting string uses the | |
|
42 | time (as determined by a call to usesTime(), formatTime() is | |
|
43 | called to format the event time. If there is exception information, | |
|
44 | it is formatted using formatException() and appended to the message. | |
|
45 | """ | |
|
46 | record.message = record.getMessage() | |
|
47 | log_dict = vars(record) | |
|
48 | keys = [k for k in log_dict.keys() if k not in ignored_keys] | |
|
49 | payload = {'message': record.message} | |
|
50 | payload.update({k: log_dict[k] for k in keys}) | |
|
51 | record.message = json.dumps(payload, default=lambda x: str(x)) | |
|
52 | ||
|
53 | if self.usesTime(): | |
|
54 | record.asctime = self.formatTime(record, self.datefmt) | |
|
55 | s = self.formatMessage(record) | |
|
56 | if record.exc_info: | |
|
57 | # Cache the traceback text to avoid converting it multiple times | |
|
58 | # (it's constant anyway) | |
|
59 | if not record.exc_text: | |
|
60 | record.exc_text = self.formatException(record.exc_info) | |
|
61 | if record.exc_text: | |
|
62 | if s[-1:] != "\n": | |
|
63 | s = s + "\n" | |
|
64 | s = s + record.exc_text | |
|
65 | if record.stack_info: | |
|
66 | if s[-1:] != "\n": | |
|
67 | s = s + "\n" | |
|
68 | s = s + self.formatStack(record.stack_info) | |
|
69 | return s |
@@ -153,7 +153,7 b' keys = root, appenlight, sqlalchemy' | |||
|
153 | 153 | keys = console |
|
154 | 154 | |
|
155 | 155 | [formatters] |
|
156 | keys = generic | |
|
156 | keys = generic, json | |
|
157 | 157 | |
|
158 | 158 | [logger_root] |
|
159 | 159 | level = WARN |
@@ -176,9 +176,14 b' qualname = sqlalchemy.engine' | |||
|
176 | 176 | class = StreamHandler |
|
177 | 177 | args = (sys.stderr,) |
|
178 | 178 | level = NOTSET |
|
179 |
formatter = |
|
|
179 | formatter = json | |
|
180 | 180 | |
|
181 | 181 | [formatter_generic] |
|
182 | 182 | format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s |
|
183 | 183 | |
|
184 | # json string will land as "message" key of format string | |
|
185 | [formatter_json] | |
|
186 | class=appenlight.lib.logging.JSONFormatter | |
|
187 | format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s | |
|
188 | ||
|
184 | 189 | # End logging configuration |
@@ -160,7 +160,7 b' keys = root, appenlight, sqlalchemy, elasticsearch' | |||
|
160 | 160 | keys = console |
|
161 | 161 | |
|
162 | 162 | [formatters] |
|
163 | keys = generic | |
|
163 | keys = generic, json | |
|
164 | 164 | |
|
165 | 165 | [logger_root] |
|
166 | 166 | level = INFO |
@@ -188,9 +188,14 b' qualname = sqlalchemy.engine' | |||
|
188 | 188 | class = StreamHandler |
|
189 | 189 | args = (sys.stderr,) |
|
190 | 190 | level = NOTSET |
|
191 |
formatter = |
|
|
191 | formatter = json | |
|
192 | 192 | |
|
193 | 193 | [formatter_generic] |
|
194 | 194 | format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s |
|
195 | 195 | |
|
196 | # json string will land as "message" key of format string | |
|
197 | [formatter_json] | |
|
198 | class=appenlight.lib.logging.JSONFormatter | |
|
199 | format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s | |
|
200 | ||
|
196 | 201 | # End logging configuration |
@@ -146,7 +146,7 b' keys = root, appenlight, sqlalchemy, elasticsearch' | |||
|
146 | 146 | keys = console |
|
147 | 147 | |
|
148 | 148 | [formatters] |
|
149 | keys = generic | |
|
149 | keys = generic, json | |
|
150 | 150 | |
|
151 | 151 | [logger_root] |
|
152 | 152 | level = INFO |
@@ -174,9 +174,14 b' qualname = sqlalchemy.engine' | |||
|
174 | 174 | class = StreamHandler |
|
175 | 175 | args = (sys.stderr,) |
|
176 | 176 | level = NOTSET |
|
177 |
formatter = |
|
|
177 | formatter = json | |
|
178 | 178 | |
|
179 | 179 | [formatter_generic] |
|
180 | 180 | format = %(asctime)s %(levelname)-5.5s [%(name)s][%(threadName)s] %(message)s |
|
181 | 181 | |
|
182 | # json string will land as "message" key of format string | |
|
183 | [formatter_json] | |
|
184 | class=appenlight.lib.logging.JSONFormatter | |
|
185 | format = %(asctime)s %(levelname)-5.5s [%(name)s:%(lineno)s][%(threadName)s] %(message)s | |
|
186 | ||
|
182 | 187 | # End logging configuration |
General Comments 0
You need to be logged in to leave comments.
Login now