~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: Matt Nordhoff
  • Date: 2009-04-30 10:27:53 UTC
  • mto: (389.2.2 pep8-2009-10)
  • mto: This revision was merged to the branch mainline in revision 392.
  • Revision ID: mnordhoff@mattnordhoff.com-20090430102753-k0fe9v60gw0at3py
Whitespace tweak to profile.py

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
 
19
19
import logging
20
 
import logging.handlers
21
20
from optparse import OptionParser
22
21
import os
23
22
import sys
24
23
import urlparse
25
24
 
26
 
from configobj import ConfigObj
 
25
from bzrlib.plugin import load_plugins
 
26
from bzrlib.util.configobj.configobj import ConfigObj
27
27
 
28
28
from paste import httpserver
29
29
from paste.httpexceptions import make_middleware
30
30
from paste.translogger import make_filter
31
31
 
32
 
from loggerhead import daemon, release
 
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', 0, 100)
40
 
    elif roll == 'weekly':
41
 
        h = logging.handlers.TimedRotatingFileHandler(filename, 'W0', 0, 100)
42
 
    else:
43
 
        h = logging.FileHandler(filename)
44
 
    return h
45
 
 
46
 
 
47
 
def setup_logging(home, config, foreground):
48
 
    # i hate that stupid logging config format, so just set up logging here.
49
 
 
50
 
    log_folder = os.path.join(home, 'logs')
51
 
    if not os.path.exists(log_folder):
52
 
        os.mkdir(log_folder)
53
 
 
54
 
    f = logging.Formatter('%(levelname)-.3s [%(asctime)s.%(msecs)03d] %(name)s: %(message)s',
55
 
                          '%Y%m%d-%H:%M:%S')
56
 
    debug_log = make_handler(config, os.path.join(log_folder, 'debug.log'))
57
 
    debug_log.setLevel(logging.DEBUG)
58
 
    debug_log.setFormatter(f)
59
 
    if foreground:
60
 
        stdout_log = logging.StreamHandler(sys.stdout)
61
 
        stdout_log.setLevel(logging.DEBUG)
62
 
        stdout_log.setFormatter(f)
63
 
    f = logging.Formatter('[%(asctime)s.%(msecs)03d] %(message)s',
64
 
                          '%Y%m%d-%H:%M:%S')
65
 
    access_log = make_handler(config, os.path.join(log_folder, 'access.log'))
66
 
    access_log.setLevel(logging.INFO)
67
 
    access_log.setFormatter(f)
68
 
 
69
 
    logging.getLogger('').setLevel(logging.DEBUG)
70
 
    logging.getLogger('').addHandler(debug_log)
71
 
    logging.getLogger('wsgi').addHandler(access_log)
72
 
 
73
 
    if foreground:
74
 
        logging.getLogger('').addHandler(stdout_log)
75
 
 
 
34
from loggerhead.trace import setup_logging
 
35
from loggerhead.apps.error import ErrorHandlerApp
76
36
 
77
37
 
78
38
def main():
79
 
    parser = OptionParser(usage='usage: %prog [options]', version='%prog ' + release.version)
80
 
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
 
39
    home = os.path.realpath(os.path.dirname(__file__))
 
40
    default_pidfile = os.path.join(home, 'loggerhead.pid')
 
41
    default_configfile = os.path.join(home, 'loggerhead.conf')
 
42
    default_log_folder = os.path.join(home, 'logs')
 
43
    parser = OptionParser(usage='usage: %prog [options]', version='%prog')
 
44
    parser.add_option('-f', '--foreground',
 
45
                      action='store_true', dest='foreground', default=False,
81
46
                      help="run in the foreground; don't daemonize")
82
 
    parser.add_option('-C', '--check', action='store_true', dest='check', default=False,
83
 
                      help="only start if not already running (useful for cron jobs)")
 
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,
 
53
                      type=str, help="override pidfile location")
 
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,
 
59
                      type=str, help="override log file directory")
84
60
    options, args = parser.parse_args()
85
61
    if len(args) > 0:
86
62
        parser.error('No filename arguments are used, only options.')
87
63
 
88
 
 
89
 
    home = os.path.realpath(os.path.dirname(__file__))
90
 
    pidfile = os.path.join(home, 'loggerhead.pid')
91
 
 
92
64
    if options.check:
93
 
        if daemon.is_running(pidfile):
 
65
        if daemon.is_running(options.pidfile):
94
66
            sys.exit(0)
95
 
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (pidfile,))
 
67
        sys.stderr.write('Did not find loggerhead running in %r;' % (
 
68
                         options.pidfile))
 
69
        sys.stderr.write(' restarting...\n')
96
70
 
97
71
    # read loggerhead config
98
72
 
99
 
    config = ConfigObj(os.path.join(home, 'loggerhead.conf'), encoding='utf-8')
 
73
    config = ConfigObj(options.configfile, encoding='utf-8')
100
74
    extra_path = config.get('bzrpath', None)
101
75
    if extra_path:
102
76
        sys.path.insert(0, extra_path)
103
77
 
104
 
    #turbogears.update_config(configfile="dev.cfg", modulename="loggerhead.config")
105
 
 
106
 
    potential_overrides = [ ('server.socket_port', int),
107
 
                            ('server.webpath', str),
108
 
                            ('server.thread_pool', int),
109
 
                            ('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)]
110
82
    server_port = int(config.get('server.socket_port', 8080))
111
83
    nworkers = int(config.get('server.thread_pool', 10))
112
84
    server_host = config.get('server.socket_host', '0.0.0.0')
116
88
        value = config.get(key, None)
117
89
        if value is not None:
118
90
            value = keytype(value)
119
 
            #turbogears.config.update({ key: value })
120
91
 
121
92
    if not options.foreground:
122
93
        sys.stderr.write('\n')
123
94
        sys.stderr.write('Launching loggerhead into the background.\n')
124
 
        sys.stderr.write('PID file: %s\n' % (pidfile,))
 
95
        sys.stderr.write('PID file: %s\n' % options.pidfile)
125
96
        sys.stderr.write('\n')
126
97
 
127
 
        daemon.daemonize(pidfile, home)
 
98
        daemon.daemonize(options.pidfile, home)
128
99
 
129
 
    setup_logging(home, config, foreground=options.foreground)
 
100
    setup_logging(options.log_folder, config, foreground=options.foreground)
130
101
 
131
102
    log = logging.getLogger('loggerhead')
132
103
    log.info('Starting up...')
135
106
 
136
107
    app = app
137
108
    app = make_middleware(app)
138
 
    app = make_filter(app, None)
 
109
    app = make_filter(app, None, logger_name=log.name+'.access')
 
110
    app = ErrorHandlerApp(app)
139
111
 
140
112
    if webpath:
141
113
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
 
114
 
142
115
        def app(environ, start_response, orig=app):
143
116
            environ['SCRIPT_NAME'] = path
144
117
            environ['HTTP_HOST'] = netloc
 
118
            environ['wsgi.url_scheme'] = scheme
145
119
            return orig(environ, start_response)
146
120
 
 
121
    load_plugins()
 
122
 
147
123
    try:
148
124
        httpserver.serve(
149
125
            app, host=server_host, port=server_port,
151
127
    finally:
152
128
        log.info('Shutdown.')
153
129
        try:
154
 
            os.remove(pidfile)
 
130
            os.remove(options.pidfile)
155
131
        except OSError:
156
132
            pass
157
133