~loggerhead-team/loggerhead/trunk-rich

« back to all changes in this revision

Viewing changes to start-loggerhead

  • Committer: John Arbash Meinel
  • Date: 2008-07-26 14:52:44 UTC
  • mto: This revision was merged to the branch mainline in revision 185.
  • Revision ID: john@arbash-meinel.com-20080726145244-l7h1ndtlu5mnm9tg
Add Copyright information to most files.

Fix the documentation for start/stop in the README.txt

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
import sys
24
24
import urlparse
25
25
 
26
 
from bzrlib.util.configobj.configobj import ConfigObj
 
26
from 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
 
32
from loggerhead import daemon, release
33
33
from loggerhead.apps.config import Root
34
 
from loggerhead.trace import make_handler, setup_logging
35
 
from loggerhead.apps.error import ErrorHandlerApp
 
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
 
36
76
 
37
77
 
38
78
def main():
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,
 
79
    parser = OptionParser(usage='usage: %prog [options]', version='%prog ' + release.version)
 
80
    parser.add_option('-f', '--foreground', action='store_true', dest='foreground', default=False,
46
81
                      help="run in the foreground; don't daemonize")
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")
 
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)")
60
84
    options, args = parser.parse_args()
61
85
    if len(args) > 0:
62
86
        parser.error('No filename arguments are used, only options.')
63
87
 
 
88
 
 
89
    home = os.path.realpath(os.path.dirname(__file__))
 
90
    pidfile = os.path.join(home, 'loggerhead.pid')
 
91
 
64
92
    if options.check:
65
 
        if daemon.is_running(options.pidfile):
 
93
        if daemon.is_running(pidfile):
66
94
            sys.exit(0)
67
 
        sys.stderr.write('Did not find loggerhead running in %r;' % (
68
 
                         options.pidfile))
69
 
        sys.stderr.write(' restarting...\n')
 
95
        sys.stderr.write('Did not find loggerhead running in %r; restarting...\n' % (pidfile,))
70
96
 
71
97
    # read loggerhead config
72
98
 
73
 
    config = ConfigObj(options.configfile, encoding='utf-8')
 
99
    config = ConfigObj(os.path.join(home, 'loggerhead.conf'), encoding='utf-8')
74
100
    extra_path = config.get('bzrpath', None)
75
101
    if extra_path:
76
102
        sys.path.insert(0, extra_path)
77
103
 
78
 
    potential_overrides = [('server.socket_port', int),
79
 
                           ('server.webpath', str),
80
 
                           ('server.thread_pool', int),
81
 
                           ('server.socket_host', str)]
 
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) ]
82
110
    server_port = int(config.get('server.socket_port', 8080))
83
111
    nworkers = int(config.get('server.thread_pool', 10))
84
112
    server_host = config.get('server.socket_host', '0.0.0.0')
88
116
        value = config.get(key, None)
89
117
        if value is not None:
90
118
            value = keytype(value)
 
119
            #turbogears.config.update({ key: value })
91
120
 
92
121
    if not options.foreground:
93
122
        sys.stderr.write('\n')
94
123
        sys.stderr.write('Launching loggerhead into the background.\n')
95
 
        sys.stderr.write('PID file: %s\n' % options.pidfile)
 
124
        sys.stderr.write('PID file: %s\n' % (pidfile,))
96
125
        sys.stderr.write('\n')
97
126
 
98
 
        daemon.daemonize(options.pidfile, home)
 
127
        daemon.daemonize(pidfile, home)
99
128
 
100
 
    setup_logging(options.log_folder, config, foreground=options.foreground)
 
129
    setup_logging(home, config, foreground=options.foreground)
101
130
 
102
131
    log = logging.getLogger('loggerhead')
103
132
    log.info('Starting up...')
106
135
 
107
136
    app = app
108
137
    app = make_middleware(app)
109
 
    app = make_filter(app, None, logger_name=log.name+'.access')
110
 
    app = ErrorHandlerApp(app)
 
138
    app = make_filter(app, None)
111
139
 
112
140
    if webpath:
113
141
        scheme, netloc, path, blah, blah, blah = urlparse.urlparse(webpath)
114
 
 
115
142
        def app(environ, start_response, orig=app):
116
143
            environ['SCRIPT_NAME'] = path
117
144
            environ['HTTP_HOST'] = netloc
118
 
            environ['wsgi.url_scheme'] = scheme
119
145
            return orig(environ, start_response)
120
146
 
121
147
    try:
125
151
    finally:
126
152
        log.info('Shutdown.')
127
153
        try:
128
 
            os.remove(options.pidfile)
 
154
            os.remove(pidfile)
129
155
        except OSError:
130
156
            pass
131
157