1
|
import logging
|
2
|
import logging.handlers
|
3
|
import os
|
4
|
|
5
|
from quixote import get_publisher, get_session, get_request
|
6
|
|
7
|
logger = None
|
8
|
logfile = None
|
9
|
|
10
|
def enable():
|
11
|
global logger, logfile, info, warn, error
|
12
|
logfile = os.path.join(get_publisher().app_dir, 'larpe.log')
|
13
|
logger = logging.getLogger('larpe' + get_publisher().app_dir)
|
14
|
if not logger.handlers:
|
15
|
hdlr = logging.handlers.RotatingFileHandler(logfile, 'a', 2**20, 100)
|
16
|
# max size = 1M
|
17
|
formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s')
|
18
|
hdlr.setFormatter(formatter)
|
19
|
logger.addHandler(hdlr)
|
20
|
logger.setLevel(logging.DEBUG)
|
21
|
|
22
|
def disable():
|
23
|
global logger
|
24
|
logger = None
|
25
|
|
26
|
def is_bot():
|
27
|
botfile = os.path.join(get_publisher().data_dir, 'webbots')
|
28
|
if not os.path.exists(botfile):
|
29
|
return False
|
30
|
user_agent = get_request().get_environ('HTTP_USER_AGENT', '')
|
31
|
for bot_ua_string in [x.strip() for x in open(botfile).readlines()]:
|
32
|
if bot_ua_string in user_agent:
|
33
|
return True
|
34
|
return False
|
35
|
|
36
|
def log(lvl, msg, session = None):
|
37
|
if not logger:
|
38
|
return
|
39
|
if not session:
|
40
|
session = get_session()
|
41
|
user_id = session.user
|
42
|
if not user_id:
|
43
|
user_id = 'anonymous'
|
44
|
if is_bot():
|
45
|
user_id = 'bot'
|
46
|
if user_id == 'bot' and lvl < logging.ERROR:
|
47
|
return # don't log bot accesses
|
48
|
address = get_request().get_environ('REMOTE_ADDR', '-')
|
49
|
path = get_request().get_path()
|
50
|
session_id = session.get_session_id() or '[nosession]'
|
51
|
logger.log(lvl, '%s %s %s %s - %s' % (address, session_id, path, user_id, msg))
|
52
|
|
53
|
def info(msg, session = None):
|
54
|
log(logging.INFO, msg, session = session)
|
55
|
|
56
|
def warn(msg, session = None):
|
57
|
log(logging.WARN, msg, session = session)
|
58
|
|
59
|
def error(msg, session = None):
|
60
|
log(logging.ERROR, msg, session = session)
|
61
|
|
62
|
def readline(line):
|
63
|
try:
|
64
|
date, hour, level, ip, session_id, url, user_id, dash, message = line.strip().split(' ', 8)
|
65
|
except ValueError:
|
66
|
return None # bad line in logs
|
67
|
if dash != '-':
|
68
|
return None
|
69
|
return locals()
|
70
|
|