Projet

Général

Profil

0001-add-a-RequestFilter-to-augment-logs-with-contextual-.patch

Benjamin Dauvergne, 24 mars 2017 11:55

Télécharger (4,37 ko)

Voir les différences:

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(-)
wcs/qommon/logger.py
16 16

  
17 17
import logging
18 18
import os
19
import hashlib
19 20

  
20 21
from quixote import get_publisher, get_session, get_request
21 22

  
......
40 41
        return False
41 42

  
42 43

  
43
class Formatter(logging.Formatter):
44
    def format(self, record):
44
class RequestFilter(logging.Filter):
45
    def filter(self, record):
45 46
        request = get_request()
47

  
48
        record.application = 'wcs'
49
        record.tenant = '-'
50
        record.ip = '-'
51
        record.path = '-'
52
        record.request_id = '-'
53
        record.user_id = 'unlogged'
54
        record.user_name = '-'
55
        record.user_email = '-'
56
        record.user_display_name = '-'
57
        record.user_uuid = '-'
58
        record.session_id = '[nosession]'
46 59
        if request:
47
            record.address = request.get_environ('REMOTE_ADDR', '-')
60
            record.tenant = request.get_server()
61
            record.ip = request.get_environ('REMOTE_ADDR', '-')
48 62
            record.path = request.get_path()
63
            record.request_id = id(request)
49 64

  
50 65
            user = request.user
51 66
            if user:
......
53 68
                    user_id = user
54 69
                else:
55 70
                    user_id = user.id
71
                    record.user_display_name = user.name or '-'
72
                    record.user_email = user.email or '-'
73
                    uuid = None
74
                    if record.name_identifiers:
75
                        uuid = record.user_uuid = user.name_identifiers[0]
76
                    record.user = user.email or uuid or user_id
56 77
                    if type(user_id) is str and user_id.startswith('anonymous-'):
57 78
                        user_id = 'anonymous'
58 79
            else:
59 80
                user_id = 'unlogged'
60 81
                if BotFilter.is_bot():
61 82
                    user_id = 'bot'
83
                    record.user = 'bot'
62 84
            record.user_id = user_id
63
        else:
64
            record.address = '-'
65
            record.path = '-'
66
            record.user_id = 'unlogged'
67
        record.session_id = (get_request() and get_session() and \
68
                get_session().get_session_id()) or '[nosession]'
85
            if get_session():
86
                # do not disseminate the real session_id
87
                record.session_id = hashlib.md5(get_session().get_session_id()).hexdigest()
88
        return True
69 89

  
90

  
91
class Formatter(logging.Formatter):
92
    def format(self, record):
70 93
        return logging.Formatter.format(self, record) \
71
                .replace('\n', '\n ')
94
            .replace('\n', '\n ')
72 95

  
73 96

  
74 97
def parse_logstream(stream):
wcs/qommon/publisher.py
949 949
        self._app_logger = logging.getLogger(self.APP_NAME + self.app_dir)
950 950
        if not self._app_logger.filters:
951 951
            self._app_logger.addFilter(logger.BotFilter())
952
            self._app_logger.addFilter(logger.RequestFilter())
952 953
        logfile = self.get_app_logger_filename()
953 954

  
954 955
        if not self._app_logger.handlers:
955 956
            hdlr = logging.handlers.RotatingFileHandler(logfile, 'a', 2**20, 100)
956 957
                # max size = 1M
957 958
            formatter = logger.Formatter(
958
                    '%(asctime)s %(levelname)s %(address)s '\
959
                    '%(session_id)s %(path)s %(user_id)s - %(message)s')
959
                '%(asctime)s %(levelname)s %(ip)s '
960
                '%(session_id)s %(path)s %(user_id)s - %(message)s')
960 961
            hdlr.setFormatter(formatter)
961 962
            self._app_logger.addHandler(hdlr)
962 963
        if debug:
963
-