From ea28482260a9cb7a36fedaf7ca695ae71acc9a68 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 12 Jan 2022 20:00:17 +0100 Subject: [PATCH] logger: add truncated session_id to log lines (#15579) --- debian/debian_config_common.py | 4 ++-- hobo/logger.py | 6 +++++- tests_multitenant/test_logger.py | 5 ++++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/debian/debian_config_common.py b/debian/debian_config_common.py index 570ce48..ef28471 100644 --- a/debian/debian_config_common.py +++ b/debian/debian_config_common.py @@ -46,7 +46,7 @@ FILE_UPLOAD_PERMISSIONS = 0o644 DEBUG_LOG_PATH = '/var/log/%s/debug' % PROJECT_NAME DEBUG_LOG_FORMAT = ( - '%(asctime)s \x1f%(tenant)s \x1f%(ip)s \x1f%(user)r \x1f%(request_id)s \x1f' + '%(asctime)s \x1f%(tenant)s \x1f%(ip)s \x1f%(user)r \x1f%(session_id)s \x1f%(request_id)s \x1f' '%(levelname)s \x1f%(name)s \x1f%(message)s' ) DEBUG_PROVISIONNING_LOG_PATH = '/var/log/%s/provisionning-debug' % PROJECT_NAME @@ -80,7 +80,7 @@ LOGGING = { }, 'formatters': { 'syslog': { - 'format': '%(application)s %(levelname)s %(tenant)s %(ip)s %(user)s %(request_id)s' + 'format': '%(application)s %(levelname)s %(tenant)s %(ip)s %(user)s %(session_id)s %(request_id)s' ' %(message)s', }, 'debug': { diff --git a/hobo/logger.py b/hobo/logger.py index 5bc8229..9bd7faa 100644 --- a/hobo/logger.py +++ b/hobo/logger.py @@ -48,6 +48,7 @@ class RequestContextFilter(logging.Filter): DEFAULT_USER_DISPLAY_NAME = '-' DEFAULT_USER_UUID = '-' DEFAULT_APPLICATION = 'django' + DEFAULT_SESSION_ID = '-' def filter(self, record): """Add username, ip and request ID to the log record. @@ -89,10 +90,13 @@ class RequestContextFilter(logging.Filter): record.ip = self.DEFAULT_IP record.path = self.DEFAULT_PATH record.request_id = self.DEFAULT_REQUEST_ID + record.session_id = self.DEFAULT_SESSION_ID if request is not None and hasattr(request, 'META'): 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 hasattr(request, 'session') and getattr(request.session, '_session_key', None): + record.session_id = 's:' + request.session._session_key[:4] # populate user attributes record.user_name = self.DEFAULT_USER_NAME @@ -193,7 +197,7 @@ class DebugLog(object): if accum: yield cursor, accum - keys = ['tenant', 'ip', 'user', 'request_id', 'level', 'logger'] + keys = ['tenant', 'ip', 'user', 'session_id', 'request_id', 'level', 'logger'] def _parse(self, cursor=0): for cursor, line in self._pre_lines(cursor=cursor): diff --git a/tests_multitenant/test_logger.py b/tests_multitenant/test_logger.py index fbc3780..0077261 100644 --- a/tests_multitenant/test_logger.py +++ b/tests_multitenant/test_logger.py @@ -19,6 +19,7 @@ import logging import logging.config import time +import mock import pytest import pytz from tenant_schemas.utils import tenant_context @@ -76,6 +77,7 @@ def debug_log(settings, tmpdir): def test_debug_log(tenants, settings, app, rf, debug_log, freezer): freezer.move_to('2020-4-20') request = rf.get('/path/') + request.session = mock.Mock(_session_key='12345678') debug_log.info('test %s is ok', 1, extra={'request': request, 'tenant': 'yes'}) lines = list(DebugLog.lines()) assert len(lines) == 0 @@ -90,9 +92,10 @@ def test_debug_log(tenants, settings, app, rf, debug_log, freezer): assert len(lines) == 2 request_id = hex(id(request))[2:].upper() assert lines[0] == { - 'cursor': 111, + 'cursor': 119, 'ip': '127.0.0.1', 'request_id': 'r:' + request_id, + 'session_id': 's:1234', 'message': 'log 2 is \nok', 'level': 'INFO', 'tenant': 'tenant1.example.net', -- 2.34.1