Projet

Général

Profil

0003-Change-default-logging-configuration-fixes-6922.patch

Benjamin Dauvergne, 09 avril 2015 17:24

Télécharger (9,93 ko)

Voir les différences:

Subject: [PATCH 3/3] Change default logging configuration (fixes #6922)

We only configure the root logger and 'django.db'. If DEBUG is True we
see the root logger to DEBUG. We do not use Django default logging
configuration by bypassing it using LOGGING_CONFIG = None[1].

* django_select2 logger is set to warning as the INFO level emit
	uninteresting messages
* django.db logger is set to INFO, to prevent getting SQL queries when
	DEBUG is True. To get the SQL queries set DEBUG_DB to True in your
	settings.
* Set a default logging configuration for the multitenant packaging
* Add a RequestContextFilter logging filterto provide, usename, ip
	and a request ID to the formatter.
* Use the new filter in default, debian and debian-multitenant settings.
* Add a new setting DEBUG_DB for activating logging of SQL queries.

[1]: https://www.caktusgroup.com/blog/2015/01/27/Django-Logging-Configuration-logging_config-default-settings-logger/
 debian-wheezy/debian_config.py             | 31 ++++++++-------------
 debian-wheezy/multitenant/debian_config.py | 44 ++++++++++++++++++++++++++++++
 src/authentic2/log_filters.py              | 26 ++++++++++++++++++
 src/authentic2/settings.py                 | 35 +++++++++++++++---------
 4 files changed, 104 insertions(+), 32 deletions(-)
 create mode 100644 src/authentic2/log_filters.py
debian-wheezy/debian_config.py
19 19

  
20 20
LOGGING = {
21 21
    'version': 1,
22 22
    'disable_existing_loggers': True,
23 23
    'filters': {
24 24
        'cleaning': {
25 25
            '()':  'authentic2.utils.CleanLogMessage',
26 26
        },
27
        'request_context': {
28
            '()':  'authentic2.log_filters.RequestContextFilter',
29
        },
27 30
    },
28 31
    'formatters': {
29 32
        'syslog': {
30
            'format': '%(levelname)s %(name)s.%(funcName)s: %(message)s',
33
            'format': '%(ip)s %(user)s %(request_id)s %(levelname)s %(name)s.%(funcName)s: %(message)s',
31 34
        },
32 35
    },
33 36
    'handlers': {
34 37
        'syslog': {
35 38
            'level': 'DEBUG',
36 39
            'address': '/dev/log',
37 40
            'class': 'logging.handlers.SysLogHandler',
38
            'filters': ['cleaning'],
41
            'filters': ['cleaning', 'request_context'],
39 42
            'formatter': 'syslog',
40 43
        },
41 44
    },
42 45
    'loggers': {
43
        'py.warnings': {
46
        # even when debugging seeing SQL queries is too much, activate it
47
        # explicitly using DEBUG_DB
48
        'django.db': {
44 49
                'handlers': ['syslog'],
45
                'level': 'WARNING',
46
                'propagate': False,
47
        },
48
        'django': {
49
                'handlers': ['syslog'],
50
                'level': 'WARNING',
51
                'propagate': False,
50
                'level': 'INFO',
52 51
        },
53
        'lasso': {
52
        # Django select2 output 
53
        'django_select2': {
54 54
                'handlers': ['syslog'],
55 55
                'level': 'WARNING',
56
                'propagate': False,
57
        },
58
        'authentic2': {
59
                'handlers': ['syslog'],
60
                'level': 'INFO',
61
                'propagate': False,
62 56
        },
63
        'authentic2_idp_openid': {
57
        '': {
64 58
                'handlers': ['syslog'],
65 59
                'level': 'INFO',
66
                'propagate': False,
67 60
        },
68 61
    },
69 62
}
70 63

  
71 64
# Old settings method
72 65
def extract_settings_from_environ():
73 66
    import os
74 67
    import json
debian-wheezy/multitenant/debian_config.py
61 61
        'NAME': PROJECT_NAME.replace('-', '_')
62 62
    }
63 63
}
64 64

  
65 65
DATABASE_ROUTERS = (
66 66
    'tenant_schemas.routers.TenantSyncRouter',
67 67
)
68 68

  
69
LOGGING = {
70
    'version': 1,
71
    'disable_existing_loggers': True,
72
    'filters': {
73
        'cleaning': {
74
            '()':  'authentic2.utils.CleanLogMessage',
75
        },
76
        'request_context': {
77
            '()':  'authentic2.log_filters.RequestContextFilter',
78
        },
79
    },
80
    'formatters': {
81
        'syslog': {
82
            'format': '%(ip)s %(user)s %(request_id)s %(levelname)s %(name)s.%(funcName)s: %(message)s',
83
        },
84
    },
85
    'handlers': {
86
        'syslog': {
87
            'level': 'DEBUG',
88
            'address': '/dev/log',
89
            'class': 'logging.handlers.SysLogHandler',
90
            'filters': ['cleaning', 'request_context'],
91
            'formatter': 'syslog',
92
        },
93
    },
94
    'loggers': {
95
        # even when debugging seeing SQL queries is too much, activate it
96
        # explicitly using DEBUG_DB
97
        'django.db': {
98
                'handlers': ['syslog'],
99
                'level': 'INFO',
100
        },
101
        # django_select2 outputs debug message at level INFO
102
        'django_select2': {
103
                'handlers': ['syslog'],
104
                'level': 'WARNING',
105
        },
106
        '': {
107
                'handlers': ['syslog'],
108
                'level': 'INFO',
109
        },
110
    },
111
}
112

  
69 113
if os.path.exists(os.path.join(ETC_DIR, 'config.py')):
70 114
    execfile(os.path.join(ETC_DIR, 'config.py'))
src/authentic2/log_filters.py
1
import logging
2

  
3
class RequestContextFilter(logging.Filter):
4
    DEFAULT_USERNAME = '-'
5
    DEFAULT_IP = '-'
6
    DEFAULT_REQUEST_ID = '-'
7

  
8
    def filter(self, record):
9
        '''Add username, ip and request ID to the log record.
10

  
11
           Inspired by django-log-request-id
12
        '''
13
        from . import middleware
14
        request = middleware.StoreRequestMiddleware.get_request()
15
        user = self.DEFAULT_USERNAME
16
        ip = self.DEFAULT_IP
17
        request_id = self.DEFAULT_REQUEST_ID
18
        if not request is None:
19
            if hasattr(request, 'user') and request.user.is_authenticated():
20
                user = unicode(request.user).encode('utf-8')
21
            ip = request.META['REMOTE_ADDR']
22
            request_id = request.request_id
23
        record.user = user
24
        record.ip = ip
25
        record.request_id = request_id
26
        return True
src/authentic2/settings.py
1
import logging.config
1 2
# Load default from Django
2 3
from django.conf.global_settings import *
3 4
import os
4 5

  
5 6
import django
6 7

  
7 8
from . import plugins
8 9

  
......
11 12
### Quick-start development settings - unsuitable for production
12 13
# See https://docs.djangoproject.com/en/dev/howto/deployment/checklist/
13 14

  
14 15
# SECURITY WARNING: keep the secret key used in production secret!
15 16
SECRET_KEY = 'please-change-me-with-a-very-long-random-string'
16 17

  
17 18
# SECURITY WARNING: don't run with debug turned on in production!
18 19
DEBUG = True
20
DEBUG_DB = False
19 21
TEMPLATE_DEBUG = True
20 22
MEDIA = 'media'
21 23

  
22 24
# See https://docs.djangoproject.com/en/dev/ref/settings/#allowed-hosts
23 25
ALLOWED_HOSTS = []
24 26

  
25 27
DATABASES = {
26 28
    'default': {
......
185 187
SERIALIZATION_MODULES = {
186 188
        'json': 'authentic2.serializers',
187 189
}
188 190

  
189 191
# Set Test runner to remove warning about test suite initialized with Django < 1.6
190 192
if django.VERSION >= (1,7):
191 193
    TEST_RUNNER = 'django.test.runner.DiscoverRunner'
192 194

  
195
LOGGING_CONFIG = None
193 196
LOGGING = {
194 197
    'version': 1,
195 198
    'disable_existing_loggers': True,
196 199
    'filters': {
197 200
        'cleaning': {
198 201
            '()':  'authentic2.utils.CleanLogMessage',
199 202
        },
203
        'request_context': {
204
            '()':  'authentic2.log_filters.RequestContextFilter',
205
        },
200 206
    },
201 207
    'formatters': {
202 208
        'verbose': {
203
            'format': '[%(asctime)s] %(levelname)s %(name)s.%(funcName)s: %(message)s',
209
            'format': '[%(asctime)s] %(ip)s %(user)s %(request_id)s %(levelname)s %(name)s.%(funcName)s: %(message)s',
204 210
            'datefmt': '%Y-%m-%d %a %H:%M:%S'
205 211
        },
206 212
    },
207 213
    'handlers': {
208 214
        'console': {
209 215
            'level': 'DEBUG',
210 216
            'class':'logging.StreamHandler',
211 217
            'formatter': 'verbose',
218
            'filters': ['cleaning', 'request_context'],
212 219
        },
213 220
    },
214 221
    'loggers': {
215
        'django': {
222
        # even when debugging seeing SQL queries is too much, activate it
223
        # explicitly using DEBUG_DB
224
        'django.db': {
216 225
                'handlers': ['console'],
217
                'level': 'WARNING',
218
                'propagate': False,
226
                'level': 'INFO',
219 227
        },
220
        'lasso': {
228
        # django_select2 outputs debug message at level INFO
229
        'django_select2': {
221 230
                'handlers': ['console'],
222 231
                'level': 'WARNING',
223
                'propagate': False,
224
        },
225
        'authentic2': {
226
                'handlers': ['console'],
227
                'level': 'INFO',
228
                'propagate': False,
229 232
        },
230
        'authentic2_idp_openid': {
233
        '': {
231 234
                'handlers': ['console'],
232 235
                'level': 'INFO',
233
                'propagate': False,
234 236
        },
235 237
    },
236 238
}
237 239

  
238 240
# Temporary fix for User.username field length
239 241
MIGRATION_MODULES = {
240 242
        'auth': 'authentic2.auth_migrations',
241 243
}
......
247 249
if 'AUTHENTIC2_SETTINGS_FILE' in os.environ:
248 250
    execfile(os.environ['AUTHENTIC2_SETTINGS_FILE'])
249 251

  
250 252
#
251 253
# Apply monkey patches
252 254
#
253 255

  
254 256
from . import fix_user_model
257

  
258
# Post local config setting
259
if DEBUG:
260
    LOGGING['loggers']['']['level'] = 'DEBUG'
261
if DEBUG_DB:
262
    LOGGING['loggers']['django.db']['level'] = 'DEBUG'
263
logging.config.dictConfig(LOGGING)
255
-