|
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 |
|