From c4cdb82a39381fc2f9acd6cc171ea17649947de6 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Thu, 23 Feb 2017 11:53:31 +0000 Subject: [PATCH] Made the logging settings explicit in ietf/settings.py (instead of copying default then modifying), and added enough surrounding information to make it possible to read also for people not very familiar with Python's intricate logging infrastructure. To a large extent to understand myself how the logging is set up in Django, and where to hook in the affirm() function. - Legacy-Id: 12902 --- ietf/settings.py | 104 +++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 87 insertions(+), 17 deletions(-) diff --git a/ietf/settings.py b/ietf/settings.py index ce526cc01..8720dfa44 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -168,11 +168,6 @@ AUTHENTICATION_BACKENDS = ( 'django.contrib.auth.backends.ModelBackend', ) # ------------------------------------------------------------------------ # Django/Python Logging Framework Modifications -# enable HTML error emails -from django.utils.log import DEFAULT_LOGGING -LOGGING = DEFAULT_LOGGING.copy() -LOGGING['handlers']['mail_admins']['include_html'] = True - # Filter out "Invalid HTTP_HOST" emails # Based on http://www.tiwoc.de/blog/2013/03/django-prevent-email-notification-on-suspiciousoperation/ from django.core.exceptions import SuspiciousOperation @@ -182,11 +177,7 @@ def skip_suspicious_operations(record): if isinstance(exc_value, SuspiciousOperation): return False return True -LOGGING['filters']['skip_suspicious_operations'] = { - '()': 'django.utils.log.CallbackFilter', - 'callback': skip_suspicious_operations, -} -LOGGING['handlers']['mail_admins']['filters'] += [ 'skip_suspicious_operations' ] + # Filter out UreadablePostError: from django.http import UnreadablePostError def skip_unreadable_post(record): @@ -195,14 +186,93 @@ def skip_unreadable_post(record): if isinstance(exc_value, UnreadablePostError): return False return True -LOGGING['filters']['skip_unreadable_posts'] = { - '()': 'django.utils.log.CallbackFilter', - 'callback': skip_unreadable_post, + +# Copied from DEFAULT_LOGGING as of Django 1.10.5 on 22 Feb 2017, and modified +# to incorporate html logging, invalid http_host filtering, and more. +# Changes from the default has comments. + +# The Python logging flow is as follows: +# (see https://docs.python.org/2.7/howto/logging.html#logging-flow) +# +# Init: get a Logger: logger = logging.getLogger(name) +# +# Logging call, e.g. logger.error(level, msg, *args, exc_info=(...), extra={...}) +# --> Logger (discard if level too low for this logger) +# (create log record from level, msg, args, exc_info, extra) +# --> Filters (discard if any filter attach to logger rejects record) +# --> Handlers (discard if level too low for handler) +# --> Filters (discard if any filter attached to handler rejects record) +# --> Formatter (format log record and emit) +# + +LOGGING = { + 'version': 1, + 'disable_existing_loggers': False, + # + 'loggers': { + 'django': { + 'handlers': ['console', 'mail_admins'], + 'level': 'INFO', + }, + 'django.server': { + 'handlers': ['django.server'], + 'level': 'INFO', + 'propagate': False, + }, + }, + # + # No logger filters + # + 'handlers': { + 'console': { + 'level': 'INFO', + 'filters': ['require_debug_true'], + 'class': 'logging.StreamHandler', + }, + 'django.server': { + 'level': 'INFO', + 'class': 'logging.StreamHandler', + 'formatter': 'django.server', + }, + 'mail_admins': { + 'level': 'ERROR', + 'filters': [ + 'require_debug_false', + 'skip_suspicious_operations', # custom + 'skip_unreadable_posts', # custom + ], + 'class': 'django.utils.log.AdminEmailHandler', + 'include_html': True, # non-default + } + }, + # + # All these are used by handlers + 'filters': { + 'require_debug_false': { + '()': 'django.utils.log.RequireDebugFalse', + }, + 'require_debug_true': { + '()': 'django.utils.log.RequireDebugTrue', + }, + # custom filter, function defined above: + 'skip_suspicious_operations': { + '()': 'django.utils.log.CallbackFilter', + 'callback': skip_suspicious_operations, + }, + # custom filter, function defined above: + 'skip_unreadable_posts': { + '()': 'django.utils.log.CallbackFilter', + 'callback': skip_unreadable_post, + }, + }, + # And finally the formatters + 'formatters': { + 'django.server': { + '()': 'django.utils.log.ServerFormatter', + 'format': '[%(server_time)s] %(message)s', + } + }, } -LOGGING['handlers']['mail_admins']['filters'] += [ 'skip_unreadable_posts' ] - - - # End logging # ------------------------------------------------------------------------