Projet

Général

Profil

Télécharger (2,08 ko) Statistiques
| Branche: | Révision:

root / larpe / trunk / logger.py @ 8843f79b

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

    
(10-10/20)