~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: Martin Pool
  • Date: 2009-03-10 01:00:45 UTC
  • mto: This revision was merged to the branch mainline in revision 298.
  • Revision ID: mbp@sourcefrog.net-20090310010045-jfewn6fpuk1wngxw
This loggerhead will work with bzr 1.13

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.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 make_handler, 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
151
124
    finally:
152
125
        log.info('Shutdown.')
153
126
        try:
154
 
            os.remove(pidfile)
 
127
            os.remove(options.pidfile)
155
128
        except OSError:
156
129
            pass
157
130