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/
This commit is contained in:
Benjamin Dauvergne 2015-04-09 11:43:14 +02:00
parent 59f536e998
commit c8e10def06
4 changed files with 108 additions and 36 deletions

View File

@ -24,10 +24,13 @@ LOGGING = {
'cleaning': {
'()': 'authentic2.utils.CleanLogMessage',
},
'request_context': {
'()': 'authentic2.log_filters.RequestContextFilter',
},
},
'formatters': {
'syslog': {
'format': '%(levelname)s %(name)s.%(funcName)s: %(message)s',
'format': '%(ip)s %(user)s %(request_id)s %(levelname)s %(name)s.%(funcName)s: %(message)s',
},
},
'handlers': {
@ -35,35 +38,25 @@ LOGGING = {
'level': 'DEBUG',
'address': '/dev/log',
'class': 'logging.handlers.SysLogHandler',
'filters': ['cleaning'],
'filters': ['cleaning', 'request_context'],
'formatter': 'syslog',
},
},
'loggers': {
'py.warnings': {
'handlers': ['syslog'],
'level': 'WARNING',
'propagate': False,
},
'django': {
'handlers': ['syslog'],
'level': 'WARNING',
'propagate': False,
},
'lasso': {
'handlers': ['syslog'],
'level': 'WARNING',
'propagate': False,
},
'authentic2': {
# even when debugging seeing SQL queries is too much, activate it
# explicitly using DEBUG_DB
'django.db': {
'handlers': ['syslog'],
'level': 'INFO',
'propagate': False,
},
'authentic2_idp_openid': {
# django_select2 outputs debug message at level INFO
'django_select2': {
'handlers': ['syslog'],
'level': 'WARNING',
},
'': {
'handlers': ['syslog'],
'level': 'INFO',
'propagate': False,
},
},
}

View File

@ -66,5 +66,49 @@ DATABASE_ROUTERS = (
'tenant_schemas.routers.TenantSyncRouter',
)
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
'filters': {
'cleaning': {
'()': 'authentic2.utils.CleanLogMessage',
},
'request_context': {
'()': 'authentic2.log_filters.RequestContextFilter',
},
},
'formatters': {
'syslog': {
'format': '%(ip)s %(user)s %(request_id)s %(levelname)s %(name)s.%(funcName)s: %(message)s',
},
},
'handlers': {
'syslog': {
'level': 'DEBUG',
'address': '/dev/log',
'class': 'logging.handlers.SysLogHandler',
'filters': ['cleaning', 'request_context'],
'formatter': 'syslog',
},
},
'loggers': {
# even when debugging seeing SQL queries is too much, activate it
# explicitly using DEBUG_DB
'django.db': {
'handlers': ['syslog'],
'level': 'INFO',
},
# django_select2 outputs debug message at level INFO
'django_select2': {
'handlers': ['syslog'],
'level': 'WARNING',
},
'': {
'handlers': ['syslog'],
'level': 'INFO',
},
},
}
if os.path.exists(os.path.join(ETC_DIR, 'config.py')):
execfile(os.path.join(ETC_DIR, 'config.py'))

View File

@ -0,0 +1,26 @@
import logging
class RequestContextFilter(logging.Filter):
DEFAULT_USERNAME = '-'
DEFAULT_IP = '-'
DEFAULT_REQUEST_ID = '-'
def filter(self, record):
'''Add username, ip and request ID to the log record.
Inspired by django-log-request-id
'''
from . import middleware
request = middleware.StoreRequestMiddleware.get_request()
user = self.DEFAULT_USERNAME
ip = self.DEFAULT_IP
request_id = self.DEFAULT_REQUEST_ID
if not request is None:
if hasattr(request, 'user') and request.user.is_authenticated():
user = unicode(request.user).encode('utf-8')
ip = request.META['REMOTE_ADDR']
request_id = request.request_id
record.user = user
record.ip = ip
record.request_id = request_id
return True

View File

@ -1,3 +1,4 @@
import logging.config
# Load default from Django
from django.conf.global_settings import *
import os
@ -16,6 +17,7 @@ SECRET_KEY = 'please-change-me-with-a-very-long-random-string'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
DEBUG_DB = False
TEMPLATE_DEBUG = True
MEDIA = 'media'
@ -190,6 +192,7 @@ SERIALIZATION_MODULES = {
if django.VERSION >= (1,7):
TEST_RUNNER = 'django.test.runner.DiscoverRunner'
LOGGING_CONFIG = None
LOGGING = {
'version': 1,
'disable_existing_loggers': True,
@ -197,10 +200,13 @@ LOGGING = {
'cleaning': {
'()': 'authentic2.utils.CleanLogMessage',
},
'request_context': {
'()': 'authentic2.log_filters.RequestContextFilter',
},
},
'formatters': {
'verbose': {
'format': '[%(asctime)s] %(levelname)s %(name)s.%(funcName)s: %(message)s',
'format': '[%(asctime)s] %(ip)s %(user)s %(request_id)s %(levelname)s %(name)s.%(funcName)s: %(message)s',
'datefmt': '%Y-%m-%d %a %H:%M:%S'
},
},
@ -209,28 +215,24 @@ LOGGING = {
'level': 'DEBUG',
'class':'logging.StreamHandler',
'formatter': 'verbose',
'filters': ['cleaning', 'request_context'],
},
},
'loggers': {
'django': {
'handlers': ['console'],
'level': 'WARNING',
'propagate': False,
},
'lasso': {
'handlers': ['console'],
'level': 'WARNING',
'propagate': False,
},
'authentic2': {
# even when debugging seeing SQL queries is too much, activate it
# explicitly using DEBUG_DB
'django.db': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
'authentic2_idp_openid': {
# django_select2 outputs debug message at level INFO
'django_select2': {
'handlers': ['console'],
'level': 'WARNING',
},
'': {
'handlers': ['console'],
'level': 'INFO',
'propagate': False,
},
},
}
@ -247,3 +249,10 @@ if 'AUTHENTIC2_SETTINGS_FILE' in os.environ:
#
from . import fix_user_model
# Post local config setting
if DEBUG:
LOGGING['loggers']['']['level'] = 'DEBUG'
if DEBUG_DB:
LOGGING['loggers']['django.db']['level'] = 'DEBUG'
logging.config.dictConfig(LOGGING)