MoinMoin/logfile/eventlog.py
author Thomas Waldmann <tw AT waldmann-edv DOT de>
Wed, 11 Feb 2009 02:34:33 +0100
changeset 4569 3caaa8c74c41
parent 4470 ea2aa935fbde
permissions -rw-r--r--
wikiutil: replace moin's cgi/urllib wrappers by calls to werkzeug.utils code
tw-public@0
     1
"""
tw-public@0
     2
    MoinMoin event log class
tw@2286
     3
tw@1909
     4
    The global event-log is mainly used for statistics (e.g. EventStats).
tw-public@0
     5
tw@1918
     6
    @copyright: 2007 MoinMoin:ThomasWaldmann
tw-public@0
     7
    @license: GNU GPL, see COPYING for details.
tw-public@0
     8
"""
tw-public@0
     9
tw@1791
    10
import time
tw@1791
    11
tw@749
    12
from MoinMoin.logfile import LogFile
tw@1791
    13
from MoinMoin import wikiutil
tw-public@0
    14
tw-public@0
    15
class EventLog(LogFile):
tw@1962
    16
    """ The global event-log is mainly used for statistics (e.g. EventStats) """
tw-public@0
    17
    def __init__(self, request, filename=None, buffer_size=65536, **kw):
tw@1000
    18
        if filename is None:
tw-public@0
    19
            rootpagename = kw.get('rootpagename', None)
tw-public@0
    20
            if rootpagename:
tw-public@0
    21
                from MoinMoin.Page import Page
tw-public@0
    22
                filename = Page(request, rootpagename).getPagePath('event-log', isfile=1)
tw-public@0
    23
            else:
tw-public@0
    24
                filename = request.rootpage.getPagePath('event-log', isfile=1)
tw-public@0
    25
        LogFile.__init__(self, filename, buffer_size)
tw-public@0
    26
tw-public@0
    27
    def add(self, request, eventtype, values=None, add_http_info=1,
tw-public@0
    28
            mtime_usecs=None):
tw-public@0
    29
        """ Write an event of type `eventtype, with optional key/value
tw@1962
    30
            pairs appended (i.e. you have to pass a dict).
tw-public@0
    31
        """
tw@447
    32
        if request.isSpiderAgent:
tw-public@0
    33
            return
tw@1000
    34
tw-public@0
    35
        if mtime_usecs is None:
tw-public@0
    36
            mtime_usecs = wikiutil.timestamp2version(time.time())
tw-public@0
    37
tw-public@0
    38
        if values is None:
tw-public@0
    39
            values = {}
tw@4470
    40
        if request.cfg.log_remote_addr and add_http_info:
tw@4470
    41
            # if cfg.log_remote_addr is False (usually for privacy reasons),
tw@4470
    42
            # we likely do not want to log user agent and http referer either.
tw-public@0
    43
            for key in ['remote_addr', 'http_user_agent', 'http_referer']:
tw-public@0
    44
                value = getattr(request, key, '')
tw-public@0
    45
                if value:
tw-public@0
    46
                    # Save those http headers in UPPERcase
tw-public@0
    47
                    values[key.upper()] = value
tw@102
    48
        # Encode values in a query string TODO: use more readable format
tw@4569
    49
        values = wikiutil.makeQueryString(values)
tw-public@0
    50
        self._add(u"%d\t%s\t%s\n" % (mtime_usecs, eventtype, values))
tw-public@0
    51
tw-public@0
    52
    def parser(self, line):
tw@1962
    53
        """ parse a event-log line into its components """
tw-public@0
    54
        try:
tw-public@0
    55
            time_usecs, eventtype, kvpairs = line.rstrip().split('\t')
tw-public@0
    56
        except ValueError:
tw-public@0
    57
            # badly formatted line in file, skip it
tw-public@0
    58
            return None
tw@102
    59
        return long(time_usecs), eventtype, wikiutil.parseQueryString(kvpairs)
tw@1000
    60
tw@1000
    61
    def set_filter(self, event_types=None):
tw@1962
    62
        """ optionally filter log for specific event types """
tw@1000
    63
        if event_types is None:
tw-public@0
    64
            self.filter = None
tw-public@0
    65
        else:
tw-public@0
    66
            self.filter = lambda line: (line[1] in event_types)
tw-public@0
    67
tw-public@0
    68