##// END OF EJS Templates
formatters: added json formatter
ergo -
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
@@ -1,184 +1,189 b''
1 1 [app:appenlight]
2 2 use = egg:appenlight
3 3 reload_templates = false
4 4 debug_authorization = false
5 5 debug_notfound = false
6 6 debug_routematch = false
7 7 debug_templates = false
8 8 default_locale_name = en
9 9 sqlalchemy.url = {{ appenlight_dbstring }}
10 10 sqlalchemy.pool_size = 10
11 11 sqlalchemy.max_overflow = 50
12 12 sqlalchemy.echo = false
13 13 jinja2.directories = appenlight:templates
14 14 jinja2.filters = nl2br = appenlight.lib.jinja2_filters.nl2br
15 15
16 16 #includes
17 17 appenlight.includes =
18 18
19 19 #redis
20 20 redis.url = redis://localhost:6379/0
21 21 redis.redlock.url = redis://localhost:6379/3
22 22
23 23 #elasticsearch
24 24 elasticsearch.nodes = http://127.0.0.1:9200
25 25
26 26 #dirs
27 27 webassets.dir = %(here)s/webassets/
28 28
29 29 # encryption
30 30 encryption_secret = {{appenlight_encryption_secret}}
31 31
32 32 #authtkt
33 33 # uncomment if you use SSL
34 34 # authtkt.secure = true
35 35 authtkt.secret = {{appenlight_authtkt_secret}}
36 36 # session settings
37 37 redis.sessions.secret = {{appenlight_redis_session_secret}}
38 38 redis.sessions.timeout = 86400
39 39
40 40 # session cookie settings
41 41 redis.sessions.cookie_name = appenlight
42 42 redis.sessions.cookie_max_age = 2592000
43 43 redis.sessions.cookie_path = /
44 44 redis.sessions.cookie_domain =
45 45 # uncomment if you use SSL
46 46 redis.sessions.cookie_secure = True
47 47 redis.sessions.cookie_httponly = True
48 48 redis.sessions.cookie_on_exception = True
49 49 redis.sessions.prefix = appenlight:session:
50 50
51 51 #cache
52 52 cache.regions = default_term, second, short_term, long_term
53 53 cache.type = ext:memcached
54 54 cache.url = 127.0.0.1:11211
55 55 cache.lock_dir = %(here)s/data/cache/lock
56 56 cache.second.expire = 1
57 57 cache.short_term.expire = 60
58 58 cache.default_term.expire = 300
59 59
60 60 #mailing
61 61 mailing.app_url = https://{{appenlight_domain}}
62 62 mailing.from_name = AppEnlight
63 63 mailing.from_email = no-reply@{{appenlight_domain}}
64 64
65 65 ###
66 66 # Authomatic configuration
67 67 ###
68 68
69 69 authomatic.secret =
70 70 authomatic.pr.facebook.app_id =
71 71 authomatic.pr.facebook.secret =
72 72 authomatic.pr.twitter.key =
73 73 authomatic.pr.twitter.secret =
74 74 authomatic.pr.google.key =
75 75 authomatic.pr.google.secret =
76 76 authomatic.pr.github.key =
77 77 authomatic.pr.github.secret =
78 78 authomatic.pr.github.scope =
79 79 authomatic.pr.bitbucket.key =
80 80 authomatic.pr.bitbucket.secret =
81 81
82 82 #ziggurat
83 83 ziggurat_foundations.model_locations.User = appenlight.models.user:User
84 84 ziggurat_foundations.sign_in.username_key = sign_in_user_name
85 85 ziggurat_foundations.sign_in.password_key = sign_in_user_password
86 86 ziggurat_foundations.sign_in.came_from_key = came_from
87 87
88 88 #cometd
89 89 cometd.server = http://127.0.0.1:8088
90 90 cometd.secret = secret
91 91 cometd.ws_url = wss://{{appenlight_domain}}/channelstream
92 92
93 93 # for celery
94 94 appenlight.api_key =
95 95 appenlight.transport_config =
96 96 appenlight.public_api_key =
97 97
98 98 # celery
99 99 celery.broker_type = redis
100 100 celery.broker_url = redis://localhost:6379/3
101 101 celery.concurrency = 2
102 102 celery.timezone = UTC
103 103
104 104 # tasks
105 105
106 106 # how often run alerting tasks (60s default)
107 107 tasks.notifications_reports.interval = 60
108 108
109 109 [filter:paste_prefix]
110 110 use = egg:PasteDeploy#prefix
111 111
112 112
113 113 [filter:appenlight_client]
114 114 use = egg:appenlight_client
115 115 appenlight.api_key =
116 116
117 117 # appenlight.transport_config = http://127.0.0.1:6543?threaded=1&timeout=5&verify=0
118 118 # by default uses api.appenlight.com server
119 119 appenlight.transport_config =
120 120 appenlight.report_local_vars = true
121 121 appenlight.report_404 = true
122 122 appenlight.timing.dbapi2_psycopg2 = 0.3
123 123
124 124
125 125
126 126 [pipeline:main]
127 127 pipeline = paste_prefix
128 128 appenlight_client
129 129 appenlight
130 130
131 131
132 132
133 133 [server:main]
134 134 use = egg:gunicorn#main
135 135 host = 0.0.0.0:6543, unix:/tmp/appenlight.sock
136 136 workers = 2
137 137 timeout = 90
138 138 max_requests = 10000
139 139
140 140 [server:api]
141 141 use = egg:gunicorn#main
142 142 host = 0.0.0.0:6553, unix:/tmp/api.appenlight.sock
143 143 workers = 2
144 144 max_requests = 10000
145 145
146 146
147 147 # Begin logging configuration
148 148
149 149 [loggers]
150 150 keys = root, appenlight, sqlalchemy
151 151
152 152 [handlers]
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
160 160 handlers = console
161 161
162 162 [logger_appenlight]
163 163 level = WARN
164 164 handlers =
165 165 qualname = appenlight
166 166
167 167 [logger_sqlalchemy]
168 168 level = WARN
169 169 handlers =
170 170 qualname = sqlalchemy.engine
171 171 # "level = INFO" logs SQL queries.
172 172 # "level = DEBUG" logs SQL queries and results.
173 173 # "level = WARN" logs neither. (Recommended for production systems.)
174 174
175 175 [handler_console]
176 176 class = StreamHandler
177 177 args = (sys.stderr,)
178 178 level = NOTSET
179 formatter = generic
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
@@ -1,196 +1,201 b''
1 1 [app:appenlight]
2 2 use = egg:appenlight
3 3 reload_templates = true
4 4 debug_authorization = true
5 5 debug_notfound = true
6 6 debug_routematch = true
7 7 debug_templates = true
8 8 default_locale_name = en
9 9 sqlalchemy.url = postgresql://test:test@localhost/appenlight
10 10 sqlalchemy.pool_size = 10
11 11 sqlalchemy.max_overflow = 50
12 12 sqlalchemy.echo = false
13 13 jinja2.directories = appenlight:templates
14 14 jinja2.filters = nl2br = appenlight.lib.jinja2_filters.nl2br
15 15
16 16
17 17 pyramid.includes = pyramid_debugtoolbar
18 18
19 19 debugtoolbar.panels =
20 20 pyramid_debugtoolbar.panels.versions.VersionDebugPanel
21 21 pyramid_debugtoolbar.panels.settings.SettingsDebugPanel
22 22 pyramid_debugtoolbar.panels.headers.HeaderDebugPanel
23 23 pyramid_debugtoolbar.panels.renderings.RenderingsDebugPanel
24 24 pyramid_debugtoolbar.panels.logger.LoggingPanel
25 25 pyramid_debugtoolbar.panels.performance.PerformanceDebugPanel
26 26 pyramid_debugtoolbar.panels.routes.RoutesDebugPanel
27 27 pyramid_debugtoolbar.panels.sqla.SQLADebugPanel
28 28 pyramid_debugtoolbar.panels.tweens.TweensDebugPanel
29 29 pyramid_debugtoolbar.panels.introspection.IntrospectionDebugPanel
30 30
31 31 appenlight.includes =
32 32
33 33 # encryption
34 34 encryption_secret = oEOikr_T98wTh_xLH3w8Se3kmbgAQYSM4poZvPosya0=
35 35
36 36 #redis
37 37 redis.url = redis://localhost:6379/0
38 38 redis.redlock.url = redis://localhost:6379/3
39 39
40 40 #elasticsearch
41 41 elasticsearch.nodes = http://127.0.0.1:9200
42 42
43 43 #dirs
44 44 webassets.dir = %(here)s/webassets/
45 45
46 46 #authtkt
47 47 authtkt.secure = false
48 48 authtkt.secret = SECRET
49 49 # session settings
50 50 redis.sessions.secret = SECRET
51 51 redis.sessions.timeout = 86400
52 52
53 53 # session cookie settings
54 54 redis.sessions.cookie_name = appenlight
55 55 redis.sessions.cookie_max_age = 2592000
56 56 redis.sessions.cookie_path = /
57 57 redis.sessions.cookie_domain =
58 58 redis.sessions.cookie_secure = False
59 59 redis.sessions.cookie_httponly = False
60 60 redis.sessions.cookie_on_exception = True
61 61 redis.sessions.prefix = appenlight:session:
62 62
63 63
64 64 #cache
65 65 cache.regions = default_term, second, short_term, long_term
66 66 cache.type = ext:memcached
67 67 cache.url = 127.0.0.1:11211
68 68 cache.lock_dir = %(here)s/data/cache/lock
69 69 cache.second.expire = 1
70 70 cache.short_term.expire = 60
71 71 cache.default_term.expire = 300
72 72
73 73 #mailing
74 74 mailing.app_url = http://localhost:6543
75 75 mailing.from_name = App Enlight LOCAL
76 76 mailing.from_email = no-reply@appenlight.local
77 77
78 78
79 79 ###
80 80 # Authomatic configuration
81 81 ###
82 82
83 83 authomatic.secret = SECRET
84 84 authomatic.pr.facebook.app_id =
85 85 authomatic.pr.facebook.secret =
86 86 authomatic.pr.twitter.key =
87 87 authomatic.pr.twitter.secret =
88 88 authomatic.pr.google.key =
89 89 authomatic.pr.google.secret =
90 90 authomatic.pr.github.key =
91 91 authomatic.pr.github.secret =
92 92 authomatic.pr.github.scope = repo, public_repo, user:email
93 93 authomatic.pr.bitbucket.key =
94 94 authomatic.pr.bitbucket.secret =
95 95
96 96 #ziggurat
97 97 ziggurat_foundations.model_locations.User = appenlight.models.user:User
98 98 ziggurat_foundations.sign_in.username_key = sign_in_user_name
99 99 ziggurat_foundations.sign_in.password_key = sign_in_user_password
100 100 ziggurat_foundations.sign_in.came_from_key = came_from
101 101
102 102 #cometd
103 103 cometd.server = http://127.0.0.1:8088/
104 104 cometd.secret = secret
105 105 cometd.ws_url = http://127.0.0.1:8088/
106 106
107 107
108 108 # for celery
109 109 appenlight.api_key =
110 110 appenlight.transport_config =
111 111 appenlight.public_api_key =
112 112
113 113 celery.broker_type = redis
114 114 celery.broker_url = redis://localhost:6379/3
115 115 celery.concurrency = 4
116 116 celery.timezone = UTC
117 117
118 118
119 119 [filter:paste_prefix]
120 120 use = egg:PasteDeploy#prefix
121 121
122 122
123 123 [filter:appenlight_client]
124 124 use = egg:appenlight_client
125 125 appenlight.api_key =
126 126 appenlight.transport_config =
127 127 appenlight.report_local_vars = true
128 128 appenlight.report_404 = true
129 129 appenlight.logging.level = DEBUG
130 130 appenlight.timing.dbapi2_psycopg2 = 0.3
131 131
132 132
133 133 [pipeline:main]
134 134 pipeline =
135 135 paste_prefix
136 136 appenlight_client
137 137 appenlight
138 138
139 139
140 140
141 141 [server:main]
142 142 use = egg:waitress
143 143 host = 0.0.0.0
144 144 port = 6543
145 145
146 146 [server:main_prod]
147 147 use = egg:gunicorn#main
148 148 host = 0.0.0.0:6543, unix:/tmp/appenlight.sock
149 149 workers = 6
150 150 timeout = 90
151 151 #max_requests = 1000
152 152
153 153
154 154 # Begin logging configuration
155 155
156 156 [loggers]
157 157 keys = root, appenlight, sqlalchemy, elasticsearch
158 158
159 159 [handlers]
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
167 167 handlers = console
168 168
169 169 [logger_appenlight]
170 170 level = INFO
171 171 handlers =
172 172 qualname = appenlight
173 173
174 174 [logger_elasticsearch]
175 175 level = WARN
176 176 handlers =
177 177 qualname = elasticsearch
178 178
179 179 [logger_sqlalchemy]
180 180 level = WARN
181 181 handlers =
182 182 qualname = sqlalchemy.engine
183 183 # "level = INFO" logs SQL queries.
184 184 # "level = DEBUG" logs SQL queries and results.
185 185 # "level = WARN" logs neither. (Recommended for production systems.)
186 186
187 187 [handler_console]
188 188 class = StreamHandler
189 189 args = (sys.stderr,)
190 190 level = NOTSET
191 formatter = generic
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
@@ -1,182 +1,187 b''
1 1 [app:appenlight]
2 2 use = egg:appenlight
3 3 reload_templates = true
4 4 debug_authorization = true
5 5 debug_notfound = true
6 6 debug_routematch = true
7 7 debug_templates = true
8 8 default_locale_name = en
9 9 sqlalchemy.url = postgresql://test:test@localhost/appenlight_test
10 10 sqlalchemy.pool_size = 2
11 11 sqlalchemy.max_overflow = 5
12 12 sqlalchemy.echo = false
13 13 jinja2.directories = appenlight:templates
14 14 jinja2.filters = nl2br = appenlight.lib.jinja2_filters.nl2br
15 15
16 16
17 17 pyramid.includes = pyramid_debugtoolbar
18 18
19 19 appenlight.includes =
20 20
21 21 # encryption
22 22 encryption_secret = oEOikr_T98wTh_xLH3w8Se3kmbgAQYSM4poZvPosya0=
23 23
24 24 #redis
25 25 redis.url = redis://localhost:6379/0
26 26 redis.redlock.url = redis://localhost:6379/3
27 27
28 28 #elasticsearch
29 29 elasticsearch.nodes = http://127.0.0.1:9200
30 30
31 31 #dirs
32 32 webassets.dir = %(here)s/webassets/
33 33
34 34 #authtkt
35 35 authtkt.secure = false
36 36 authtkt.secret = SECRET
37 37 # session settings
38 38 redis.sessions.secret = SECRET
39 39 redis.sessions.timeout = 3600
40 40
41 41 # session cookie settings
42 42 redis.sessions.cookie_name = appenlight
43 43 redis.sessions.cookie_max_age = 2592000
44 44 redis.sessions.cookie_path = /
45 45 redis.sessions.cookie_domain =
46 46 redis.sessions.cookie_secure = False
47 47 redis.sessions.cookie_httponly = False
48 48 redis.sessions.cookie_on_exception = True
49 49 redis.sessions.prefix = appenlight:session:
50 50
51 51
52 52 #cache
53 53 cache.regions = default_term, second, short_term, long_term
54 54 cache.type = ext:memcached
55 55 cache.url = 127.0.0.1:11211
56 56 cache.lock_dir = %(here)s/data/cache/lock
57 57 cache.second.expire = 1
58 58 cache.short_term.expire = 60
59 59 cache.default_term.expire = 300
60 60
61 61 #mailing
62 62 mailing.app_url = https://appenlight.com
63 63 mailing.from_name = App Enlight LOCAL
64 64 mailing.from_email = no-reply@status.appenlight.com
65 65
66 66
67 67 ###
68 68 # Authomatic configuration
69 69 ###
70 70
71 71 authomatic.secret = secret
72 72 authomatic.pr.facebook.app_id =
73 73 authomatic.pr.facebook.secret =
74 74 authomatic.pr.twitter.key =
75 75 authomatic.pr.twitter.secret =
76 76 authomatic.pr.google.key =
77 77 authomatic.pr.google.secret =
78 78 authomatic.pr.github.key =
79 79 authomatic.pr.github.secret =
80 80 authomatic.pr.github.scope = repo, public_repo, user:email
81 81 authomatic.pr.bitbucket.key =
82 82 authomatic.pr.bitbucket.secret =
83 83
84 84 #ziggurat
85 85 ziggurat_foundations.model_locations.User = appenlight.models.user:User
86 86 ziggurat_foundations.sign_in.username_key = sign_in_user_name
87 87 ziggurat_foundations.sign_in.password_key = sign_in_user_password
88 88 ziggurat_foundations.sign_in.came_from_key = came_from
89 89
90 90 #cometd
91 91 cometd.server = http://127.0.0.1:8088/
92 92 cometd.secret = secret
93 93 cometd.ws_url = wss://127.0.0.1:8088/
94 94
95 95
96 96 # for celery
97 97 appenlight.api_key =
98 98 appenlight.transport_config = http://127.0.0.1:6543
99 99
100 100 celery.broker_type = redis
101 101 celery.broker_url = redis://localhost:6379/4
102 102 celery.concurrency = 4
103 103 celery.timezone = UTC
104 104 celery.always_eager = true
105 105
106 106 [filter:paste_prefix]
107 107 use = egg:PasteDeploy#prefix
108 108
109 109
110 110 [filter:appenlight_client]
111 111 use = egg:appenlight_client
112 112 appenlight.api_key =
113 113 appenlight.transport_config = http://127.0.0.1:6543
114 114 appenlight.report_local_vars = true
115 115 appenlight.report_404 = true
116 116 appenlight.timing.dbapi2_psycopg2 = 0.3
117 117
118 118
119 119 [pipeline:main]
120 120 pipeline =
121 121 paste_prefix
122 122 appenlight_client
123 123 appenlight
124 124
125 125
126 126
127 127 [server:main]
128 128 use = egg:waitress
129 129 host = 0.0.0.0
130 130 port = 6543
131 131
132 132 [server:main_prod]
133 133 use = egg:gunicorn#main
134 134 host = 0.0.0.0:6543, unix:/tmp/appenlight.sock
135 135 workers = 6
136 136 timeout = 90
137 137 #max_requests = 1000
138 138
139 139
140 140 # Begin logging configuration
141 141
142 142 [loggers]
143 143 keys = root, appenlight, sqlalchemy, elasticsearch
144 144
145 145 [handlers]
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
153 153 handlers = console
154 154
155 155 [logger_appenlight]
156 156 level = INFO
157 157 handlers =
158 158 qualname = appenlight
159 159
160 160 [logger_elasticsearch]
161 161 level = WARN
162 162 handlers =
163 163 qualname = elasticsearch
164 164
165 165 [logger_sqlalchemy]
166 166 level = WARN
167 167 handlers =
168 168 qualname = sqlalchemy.engine
169 169 # "level = INFO" logs SQL queries.
170 170 # "level = DEBUG" logs SQL queries and results.
171 171 # "level = WARN" logs neither. (Recommended for production systems.)
172 172
173 173 [handler_console]
174 174 class = StreamHandler
175 175 args = (sys.stderr,)
176 176 level = NOTSET
177 formatter = generic
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