From cd304091f3bd07604f28132f03ef4b8162bc1c0c Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 24 Mar 2017 11:54:07 +0100 Subject: [PATCH 1/2] add a RequestFilter to augment logs with contextual informations (#10411) Fields added are: - ip - path - user_id - user_name - user_email - user_display_name - user_uuid - session_id (md5 of the real session id) - request_id ( id(request) ) - tenant --- wcs/qommon/logger.py | 43 +++++++++++++++++++++++++++++++++---------- wcs/qommon/publisher.py | 5 +++-- 2 files changed, 36 insertions(+), 12 deletions(-) diff --git a/wcs/qommon/logger.py b/wcs/qommon/logger.py index 18c28cc..2cca2da 100644 --- a/wcs/qommon/logger.py +++ b/wcs/qommon/logger.py @@ -16,6 +16,7 @@ import logging import os +import hashlib from quixote import get_publisher, get_session, get_request @@ -40,12 +41,26 @@ class BotFilter(logging.Filter): return False -class Formatter(logging.Formatter): - def format(self, record): +class RequestFilter(logging.Filter): + def filter(self, record): request = get_request() + + record.application = 'wcs' + record.tenant = '-' + record.ip = '-' + record.path = '-' + record.request_id = '-' + record.user_id = 'unlogged' + record.user_name = '-' + record.user_email = '-' + record.user_display_name = '-' + record.user_uuid = '-' + record.session_id = '[nosession]' if request: - record.address = request.get_environ('REMOTE_ADDR', '-') + record.tenant = request.get_server() + record.ip = request.get_environ('REMOTE_ADDR', '-') record.path = request.get_path() + record.request_id = id(request) user = request.user if user: @@ -53,22 +68,30 @@ class Formatter(logging.Formatter): user_id = user else: user_id = user.id + record.user_display_name = user.name or '-' + record.user_email = user.email or '-' + uuid = None + if record.name_identifiers: + uuid = record.user_uuid = user.name_identifiers[0] + record.user = user.email or uuid or user_id if type(user_id) is str and user_id.startswith('anonymous-'): user_id = 'anonymous' else: user_id = 'unlogged' if BotFilter.is_bot(): user_id = 'bot' + record.user = 'bot' record.user_id = user_id - else: - record.address = '-' - record.path = '-' - record.user_id = 'unlogged' - record.session_id = (get_request() and get_session() and \ - get_session().get_session_id()) or '[nosession]' + if get_session(): + # do not disseminate the real session_id + record.session_id = hashlib.md5(get_session().get_session_id()).hexdigest() + return True + +class Formatter(logging.Formatter): + def format(self, record): return logging.Formatter.format(self, record) \ - .replace('\n', '\n ') + .replace('\n', '\n ') def parse_logstream(stream): diff --git a/wcs/qommon/publisher.py b/wcs/qommon/publisher.py index 8a131e8..a7dca9e 100644 --- a/wcs/qommon/publisher.py +++ b/wcs/qommon/publisher.py @@ -949,14 +949,15 @@ class QommonPublisher(Publisher, object): self._app_logger = logging.getLogger(self.APP_NAME + self.app_dir) if not self._app_logger.filters: self._app_logger.addFilter(logger.BotFilter()) + self._app_logger.addFilter(logger.RequestFilter()) logfile = self.get_app_logger_filename() if not self._app_logger.handlers: hdlr = logging.handlers.RotatingFileHandler(logfile, 'a', 2**20, 100) # max size = 1M formatter = logger.Formatter( - '%(asctime)s %(levelname)s %(address)s '\ - '%(session_id)s %(path)s %(user_id)s - %(message)s') + '%(asctime)s %(levelname)s %(ip)s ' + '%(session_id)s %(path)s %(user_id)s - %(message)s') hdlr.setFormatter(formatter) self._app_logger.addHandler(hdlr) if debug: -- 2.1.4