~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

[rs=me] upgrade to loggerhead trunk r418 to get better lru protection

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
# along with this program; if not, write to the Free Software
14
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
15
15
 
16
 
"""A script for starting the loggerhead process."""
 
16
"""
 
17
WARNING! This script has been deprecated and will go away soon!
 
18
A script for starting the loggerhead process.
 
19
"""
17
20
 
18
21
 
19
22
import logging
20
 
import logging.handlers
21
23
from optparse import OptionParser
22
24
import os
23
25
import sys
24
26
import urlparse
25
27
 
26
 
from configobj import ConfigObj
 
28
from bzrlib.plugin import load_plugins
 
29
from bzrlib.util.configobj.configobj import ConfigObj
27
30
 
28
31
from paste import httpserver
29
32
from paste.httpexceptions import make_middleware
30
33
from paste.translogger import make_filter
31
34
 
32
 
from loggerhead import daemon, release
 
35
from loggerhead import daemon
33
36
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
 
 
 
37
from loggerhead.trace import setup_logging
 
38
from loggerhead.apps.error import ErrorHandlerApp
76
39
 
77
40
 
78
41
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,
 
42
    sys.stderr.write('\n\n')
 
43
    sys.stderr.write('WARNING!!! This script has been deprecated by '
 
44
                     'serve-branches, and will be removed in the next '
 
45
                     'release. Please migrate to serve-branches and report '
 
46
                     'any missing features.\n')
 
47
    sys.stderr.write('\n\n')
 
48
 
 
49
    home = os.path.realpath(os.path.dirname(__file__))
 
50
    default_pidfile = os.path.join(home, 'loggerhead.pid')
 
51
    default_configfile = os.path.join(home, 'loggerhead.conf')
 
52
    default_log_folder = os.path.join(home, 'logs')
 
53
    parser = OptionParser(usage='usage: %prog [options]', version='%prog')
 
54
    parser.add_option('-f', '--foreground',
 
55
                      action='store_true', dest='foreground', default=False,
81
56
                      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)")
 
57
    parser.add_option('-C', '--check', action='store_true',
 
58
                      dest='check', default=False,
 
59
                      help=("only start if not already running (useful for "
 
60
                            "cron jobs)"))
 
61
    parser.add_option('-p', '--pidfile', dest="pidfile",
 
62
                      default=default_pidfile,
 
63
                      type=str, help="override pidfile location")
 
64
    parser.add_option('-c', '--config-file', dest="configfile",
 
65
                      default=default_configfile,
 
66
                      type=str, help="override configuration file location")
 
67
    parser.add_option('-L', '--log-folder', dest="log_folder",
 
68
                      default=default_log_folder,
 
69
                      type=str, help="override log file directory")
84
70
    options, args = parser.parse_args()
85
71
    if len(args) > 0:
86
72
        parser.error('No filename arguments are used, only options.')
87
73
 
88
 
 
89
 
    home = os.path.realpath(os.path.dirname(__file__))
90
 
    pidfile = os.path.join(home, 'loggerhead.pid')
91
 
 
92
74
    if options.check:
93
 
        if daemon.is_running(pidfile):
 
75
        if daemon.is_running(options.pidfile):
94
76
            sys.exit(0)
95
 
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (pidfile,))
 
77
        sys.stderr.write('Did not find loggerhead running in %r;' % (
 
78
                         options.pidfile))
 
79
        sys.stderr.write(' restarting...\n')
96
80
 
97
81
    # read loggerhead config
98
82
 
99
 
    config = ConfigObj(os.path.join(home, 'loggerhead.conf'), encoding='utf-8')
 
83
    config = ConfigObj(options.configfile, encoding='utf-8')
100
84
    extra_path = config.get('bzrpath', None)
101
85
    if extra_path:
102
86
        sys.path.insert(0, extra_path)
103
87
 
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) ]
 
88
    potential_overrides = [('server.socket_port', int),
 
89
                           ('server.webpath', str),
 
90
                           ('server.thread_pool', int),
 
91
                           ('server.socket_host', str)]
110
92
    server_port = int(config.get('server.socket_port', 8080))
111
93
    nworkers = int(config.get('server.thread_pool', 10))
112
94
    server_host = config.get('server.socket_host', '0.0.0.0')
116
98
        value = config.get(key, None)
117
99
        if value is not None:
118
100
            value = keytype(value)
119
 
            #turbogears.config.update({ key: value })
120
101
 
121
102
    if not options.foreground:
122
103
        sys.stderr.write('\n')
123
104
        sys.stderr.write('Launching loggerhead into the background.\n')
124
 
        sys.stderr.write('PID file: %s\n' % (pidfile,))
 
105
        sys.stderr.write('PID file: %s\n' % (options.pidfile,))
125
106
        sys.stderr.write('\n')
126
107
 
127
 
        daemon.daemonize(pidfile, home)
 
108
        daemon.daemonize(options.pidfile, home)
128
109
 
129
 
    setup_logging(home, config, foreground=options.foreground)
 
110
    setup_logging(options.log_folder, config, foreground=options.foreground)
130
111
 
131
112
    log = logging.getLogger('loggerhead')
132
113
    log.info('Starting up...')
135
116
 
136
117
    app = app
137
118
    app = make_middleware(app)
138
 
    app = make_filter(app, None)
 
119
    app = make_filter(app, None, logger_name=log.name+'.access')
 
120
    app = ErrorHandlerApp(app)
139
121
 
140
122
    if webpath:
141
123
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
 
124
 
142
125
        def app(environ, start_response, orig=app):
143
126
            environ['SCRIPT_NAME'] = path
144
127
            environ['HTTP_HOST'] = netloc
 
128
            environ['wsgi.url_scheme'] = scheme
145
129
            return orig(environ, start_response)
146
130
 
 
131
    load_plugins()
 
132
 
147
133
    try:
148
134
        httpserver.serve(
149
135
            app, host=server_host, port=server_port,
151
137
    finally:
152
138
        log.info('Shutdown.')
153
139
        try:
154
 
            os.remove(pidfile)
 
140
            os.remove(options.pidfile)
155
141
        except OSError:
156
142
            pass
157
143