~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

[rs=mwhudson] Merged the latest and greatest from trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
import sys
24
24
import urlparse
25
25
 
26
 
from configobj import ConfigObj
 
26
from bzrlib.util.configobj import ConfigObj
27
27
 
28
28
from paste import httpserver
29
29
from paste.httpexceptions import make_middleware
31
31
 
32
32
from loggerhead import daemon
33
33
from loggerhead.apps.config import Root
34
 
 
35
 
 
36
 
def make_handler(config, filename):
37
 
    roll = config.get('log.roll', 'never')
38
 
    if roll == 'daily':
39
 
        h = logging.handlers.TimedRotatingFileHandler(filename, 'midnight', 1, 100)
40
 
    elif roll == 'weekly':
41
 
        h = logging.handlers.TimedRotatingFileHandler(filename, 'W0', 1, 100)
42
 
    else:
43
 
        h = logging.FileHandler(filename)
44
 
    return h
45
 
 
46
 
 
47
 
def setup_logging(log_folder, config, foreground):
48
 
    # i hate that stupid logging config format, so just set up logging here.
49
 
 
50
 
    if not os.path.exists(log_folder):
51
 
        os.mkdir(log_folder)
52
 
 
53
 
    f = logging.Formatter('%(levelname)-.3s [%(asctime)s.%(msecs)03d] %(name)s: %(message)s',
54
 
                          '%Y%m%d-%H:%M:%S')
55
 
    debug_log = make_handler(config, os.path.join(log_folder, 'debug.log'))
56
 
    debug_log.setLevel(logging.DEBUG)
57
 
    debug_log.setFormatter(f)
58
 
    if foreground:
59
 
        stdout_log = logging.StreamHandler(sys.stdout)
60
 
        stdout_log.setLevel(logging.DEBUG)
61
 
        stdout_log.setFormatter(f)
62
 
    f = logging.Formatter('[%(asctime)s.%(msecs)03d] %(message)s',
63
 
                          '%Y%m%d-%H:%M:%S')
64
 
    access_log = make_handler(config, os.path.join(log_folder, 'access.log'))
65
 
    access_log.setLevel(logging.INFO)
66
 
    access_log.setFormatter(f)
67
 
 
68
 
    logging.getLogger('').setLevel(logging.DEBUG)
69
 
    logging.getLogger('').addHandler(debug_log)
70
 
    logging.getLogger('wsgi').addHandler(access_log)
71
 
 
72
 
    if foreground:
73
 
        logging.getLogger('').addHandler(stdout_log)
74
 
 
 
34
from loggerhead.trace import make_handler, setup_logging
 
35
from loggerhead.apps.error import ErrorHandlerApp
75
36
 
76
37
 
77
38
def main():
80
41
    default_configfile = os.path.join(home, 'loggerhead.conf')
81
42
    default_log_folder = os.path.join(home, 'logs')
82
43
    parser = OptionParser(usage='usage: %prog [options]', version='%prog')
83
 
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
 
44
    parser.add_option('-f', '--foreground',
 
45
                      action='store_true', dest='foreground', default=False,
84
46
                      help="run in the foreground; don't daemonize")
85
 
    parser.add_option('-C', '--check', action='store_true', dest='check', default=False,
86
 
                      help="only start if not already running (useful for cron jobs)")
87
 
    parser.add_option('-p', '--pidfile', dest="pidfile", default=default_pidfile,
 
47
    parser.add_option('-C', '--check', action='store_true',
 
48
                      dest='check', default=False,
 
49
                      help=("only start if not already running (useful for "
 
50
                            "cron jobs)"))
 
51
    parser.add_option('-p', '--pidfile', dest="pidfile",
 
52
                      default=default_pidfile,
88
53
                      type=str, help="override pidfile location")
89
 
    parser.add_option('-c', '--config-file', dest="configfile", default=default_configfile,
90
 
                                          type=str, help="override configuration file location")
91
 
    parser.add_option('-L', '--log-folder', dest="log_folder", default=default_log_folder,
 
54
    parser.add_option('-c', '--config-file', dest="configfile",
 
55
                      default=default_configfile,
 
56
                      type=str, help="override configuration file location")
 
57
    parser.add_option('-L', '--log-folder', dest="log_folder",
 
58
                      default=default_log_folder,
92
59
                      type=str, help="override log file directory")
93
60
    options, args = parser.parse_args()
94
61
    if len(args) > 0:
97
64
    if options.check:
98
65
        if daemon.is_running(options.pidfile):
99
66
            sys.exit(0)
100
 
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (options.pidfile,))
 
67
        sys.stderr.write('Did not find loggerhead running in %r;' % (
 
68
                         options.pidfile))
 
69
        sys.stderr.write(' restarting...\n')
101
70
 
102
71
    # read loggerhead config
103
72
 
106
75
    if extra_path:
107
76
        sys.path.insert(0, extra_path)
108
77
 
109
 
    potential_overrides = [ ('server.socket_port', int),
110
 
                            ('server.webpath', str),
111
 
                            ('server.thread_pool', int),
112
 
                            ('server.socket_host' ,str) ]
 
78
    potential_overrides = [('server.socket_port', int),
 
79
                           ('server.webpath', str),
 
80
                           ('server.thread_pool', int),
 
81
                           ('server.socket_host', str)]
113
82
    server_port = int(config.get('server.socket_port', 8080))
114
83
    nworkers = int(config.get('server.thread_pool', 10))
115
84
    server_host = config.get('server.socket_host', '0.0.0.0')
123
92
    if not options.foreground:
124
93
        sys.stderr.write('\n')
125
94
        sys.stderr.write('Launching loggerhead into the background.\n')
126
 
        sys.stderr.write('PID file: %s\n' % (options.pidfile,))
 
95
        sys.stderr.write('PID file: %s\n' % options.pidfile)
127
96
        sys.stderr.write('\n')
128
97
 
129
98
        daemon.daemonize(options.pidfile, home)
137
106
 
138
107
    app = app
139
108
    app = make_middleware(app)
140
 
    app = make_filter(app, None)
 
109
    app = make_filter(app, None, logger_name=log.name+'.access')
 
110
    app = ErrorHandlerApp(app)
141
111
 
142
112
    if webpath:
143
113
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
 
114
 
144
115
        def app(environ, start_response, orig=app):
145
116
            environ['SCRIPT_NAME'] = path
146
117
            environ['HTTP_HOST'] = netloc