2 MoinMoin event log class
4 The global event-log is mainly used for statistics (e.g. EventStats).
7 @license: GNU GPL, see COPYING for details.
12 from MoinMoin.logfile import LogFile
13 from MoinMoin import wikiutil
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):
19 rootpagename = kw.get('rootpagename', None)
21 from MoinMoin.Page import Page
22 filename = Page(request, rootpagename).getPagePath('event-log', isfile=1)
24 filename = request.rootpage.getPagePath('event-log', isfile=1)
25 LogFile.__init__(self, filename, buffer_size)
27 def add(self, request, eventtype, values=None, add_http_info=1,
29 """ Write an event of type `eventtype, with optional key/value
30 pairs appended (i.e. you have to pass a dict).
32 if request.isSpiderAgent:
35 if mtime_usecs is None:
36 mtime_usecs = wikiutil.timestamp2version(time.time())
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, '')
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))
52 def parser(self, line):
53 """ parse a event-log line into its components """
55 time_usecs, eventtype, kvpairs = line.rstrip().split('\t')
57 # badly formatted line in file, skip it
59 return long(time_usecs), eventtype, wikiutil.parseQueryString(kvpairs)
61 def set_filter(self, event_types=None):
62 """ optionally filter log for specific event types """
63 if event_types is None:
66 self.filter = lambda line: (line[1] in event_types)