From 9654fd1cbd5596ef53f38ef14fc897ee61db1618 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Tue, 5 Mar 2019 17:27:59 +0100 Subject: [PATCH 3/3] logger: improve logic in RequestContextFilter (#31108) Previous logic forbid passing explicit user and request in the log call like that : logger.info('message', extra={'request': request, 'user': user}) --- hobo/logger.py | 85 ++++++++++++++++++++++++++------------------------ 1 file changed, 44 insertions(+), 41 deletions(-) diff --git a/hobo/logger.py b/hobo/logger.py index 987e0e3..9b6dc59 100644 --- a/hobo/logger.py +++ b/hobo/logger.py @@ -16,6 +16,11 @@ import logging +from django.conf import settings +from django.db import connection + +from hobo.middleware.utils import StoreRequestMiddleware + class SettingsLogLevel(int): def __new__(cls, default_log_level, debug_setting='DEBUG'): @@ -60,57 +65,55 @@ class RequestContextFilter(logging.Filter): Inspired by django-log-request-id ''' - if (hasattr(record, 'user') - and hasattr(record.user, 'is_authenticated') - and record.user.is_authenticated()): - user = record.user - del record.user - else: - user = None - - from hobo.middleware.utils import StoreRequestMiddleware - from django.conf import settings - from django.db import connection - record.tenant = self.DEFAULT_TENANT + + # lookup request from record then StoreRequestMiddleware + if not hasattr(record, 'request'): + record.request = StoreRequestMiddleware.get_request() + request = record.request + + # lookup user from record then from request + if not hasattr(record, 'user'): + if (hasattr(request, 'user') + and hasattr(request.user, 'is_authenticated') + and request.user.is_authenticated()): + record.user = request.user + else: + record.user = None + user = record.user + + # lookup tenant + tenant = getattr(connection, 'tenant', None) + record.tenant = getattr(tenant, 'domain_url', self.DEFAULT_TENANT) + + record.application = getattr(settings, 'PROJECT_NAME', self.DEFAULT_APPLICATION) + + # populate request attributes record.ip = self.DEFAULT_IP record.path = self.DEFAULT_PATH - record.application = getattr(settings, 'PROJECT_NAME', self.DEFAULT_APPLICATION) record.request_id = self.DEFAULT_REQUEST_ID - record.user_name = self.DEFAULT_USER_NAME - record.user_email = self.DEFAULT_USER_EMAIL - record.user_display_name = self.DEFAULT_USER_DISPLAY_NAME - record.user_uuid = self.DEFAULT_USER_UUID - record.user = self.DEFAULT_USER - - if getattr(getattr(connection, 'tenant', None), 'domain_url', None): - record.tenant = connection.tenant.domain_url - request = StoreRequestMiddleware.get_request() - if request is not None: - if not hasattr(record, 'request'): - record.request = request record.ip = request.META.get('REMOTE_ADDR', self.DEFAULT_IP) record.path = request.get_full_path() record.request_id = 'r:' + hex(id(request))[2:].upper() - # if caller already passed an user, it means it knows better - if user is None and hasattr(request, 'user') and request.user.is_authenticated(): - user = request.user - if user: + # populate user attributes + record.user_name = self.DEFAULT_USER_NAME + record.user_email = self.DEFAULT_USER_EMAIL + record.user_display_name = self.DEFAULT_USER_DISPLAY_NAME + record.user_uuid = self.DEFAULT_USER_UUID + record.user = self.DEFAULT_USER + if user is not None: + if hasattr(user, 'saml_identifiers'): + saml_identifier = user.saml_identifiers.first() + if saml_identifier: + record.user_uuid = saml_identifier.name_id + record.user = record.user_uuid[:6] + if hasattr(user, 'get_full_name') and user.get_full_name(): + record.user = record.user_display_name = user.get_full_name() if getattr(user, 'email', None): - record.user_email = user.email - record.user = user.email + record.user = record.user_email = user.email if getattr(user, 'username', None): - record.user_name = user.username - record.user = user.username - if hasattr(user, 'get_full_name') and user.get_full_name(): - record.user_display_name = user.get_full_name() - if hasattr(user, 'saml_identifiers'): - saml_identifiers = user.saml_identifiers.all() - if saml_identifiers: - record.user_uuid = saml_identifiers[0].name_id - if record.user == self.DEFAULT_USER: - record.user = record.user_uuid[:7] + record.user = record.user_name = user.username return True -- 2.20.1