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