Add logging level command line options.

Refactored the scripts to be more DRY as well. gunicorn_django needs
testing as I don't have a django environ handy to test with.
This commit is contained in:
Paul J. Davis 2010-01-17 12:33:45 -05:00
parent ec301fd43d
commit aa30df9e26
6 changed files with 96 additions and 54 deletions

1
.gitignore vendored
View File

@ -1,6 +1,7 @@
*.gem *.gem
*.swp *.swp
*.pyc *.pyc
*#*
build build
dist dist
setuptools-* setuptools-*

View File

@ -25,38 +25,24 @@
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE. # OTHER DEALINGS IN THE SOFTWARE.
import optparse as op
import os import os
import sys import sys
sys.path.insert(0, os.getcwd()) sys.path.insert(0, os.getcwd())
import gunicorn from gunicorn.main import main
from gunicorn import util from gunicorn.util import import_app
__usage__ = "%prog [OPTIONS] APP_MODULE" __usage__ = "%prog [OPTIONS] APP_MODULE"
def options(): def get_app(parser, opts, args):
return [
op.make_option('--host', dest='host', default='127.0.0.1',
help='Host to listen on. [%default]'),
op.make_option('--port', dest='port', default=8000, type='int',
help='Port to listen on. [%default]'),
op.make_option('--workers', dest='workers', default=1, type='int',
help='Number of workers to spawn. [%default]')
]
def main():
parser = op.OptionParser(usage=__usage__, option_list=options())
opts, args = parser.parse_args()
if len(args) != 1: if len(args) != 1:
parser.error("No application module specified.") parser.error("No application module specified.")
app = util.import_app(args[0]) try:
return import_app(args[0])
except:
parser.error("Failed to import application module.")
arbiter = gunicorn.Arbiter((opts.host, opts.port), opts.workers, app) main(__usage__, get_app)
arbiter.run()
if __name__ == '__main__':
main()

31
bin/gunicorn_django Normal file → Executable file
View File

@ -25,12 +25,8 @@
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE. # OTHER DEALINGS IN THE SOFTWARE.
import optparse as op
import os
import sys
import django.core.handlers.wsgi import django.core.handlers.wsgi
import gunicorn from gunicorn.main import main
__usage__ = "%prog [OPTIONS]" __usage__ = "%prog [OPTIONS]"
@ -41,25 +37,8 @@ PROJECT_NAME = os.path.split(PROJECT_PATH)[-1]
sys.path.insert(0, os.path.join(PROJECT_PATH, "..")) sys.path.insert(0, os.path.join(PROJECT_PATH, ".."))
os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % PROJECT_NAME os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % PROJECT_NAME
# django wsgi app def get_app(parser, opts, args):
app = django.core.handlers.wsgi.WSGIHandler() # django wsgi app
return django.core.handlers.wsgi.WSGIHandler()
def options(): main(__usage__, get_app)
return [
op.make_option('--host', dest='host', default='127.0.0.1',
help='Host to listen on. [%default]'),
op.make_option('--port', dest='port', default=8000, type='int',
help='Port to listen on. [%default]'),
op.make_option('--workers', dest='workers', default=1, type='int',
help='Number of workers to spawn. [%default]')
]
def main():
parser = op.OptionParser(usage=__usage__, option_list=options())
opts, args = parser.parse_args()
arbiter = gunicorn.Arbiter((opts.host, opts.port), opts.workers,app)
arbiter.run()
if __name__ == '__main__':
main()

View File

@ -25,5 +25,3 @@
# OTHER DEALINGS IN THE SOFTWARE. # OTHER DEALINGS IN THE SOFTWARE.
__version__ = "0.1" __version__ = "0.1"
from arbiter import Arbiter

View File

@ -36,7 +36,6 @@ import time
from worker import Worker from worker import Worker
logging.basicConfig(level=logging.DEBUG, format="%(levelname)s: %(message)s")
log = logging.getLogger(__name__) log = logging.getLogger(__name__)
class Arbiter(object): class Arbiter(object):

79
gunicorn/main.py Normal file
View File

@ -0,0 +1,79 @@
# -*- coding: utf-8 -
#
# 2009 (c) Benoit Chesneau <benoitc@e-engura.com>
# 2009 (c) Paul J. Davis <paul.joseph.davis@gmail.com>
#
# Permission is hereby granted, free of charge, to any person
# obtaining a copy of this software and associated documentation
# files (the "Software"), to deal in the Software without
# restriction, including without limitation the rights to use,
# copy, modify, merge, publish, distribute, sublicense, and/or sell
# copies of the Software, and to permit persons to whom the
# Software is furnished to do so, subject to the following
# conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
# OTHER DEALINGS IN THE SOFTWARE.
import logging
import optparse as op
import os
import sys
from arbiter import Arbiter
LOG_LEVELS = {
"critical": logging.CRITICAL,
"error": logging.ERROR,
"warning": logging.WARNING,
"info": logging.INFO,
"debug": logging.DEBUG
}
def options():
return [
op.make_option('--host', dest='host', default='127.0.0.1',
help='Host to listen on. [%default]'),
op.make_option('--port', dest='port', default=8000, type='int',
help='Port to listen on. [%default]'),
op.make_option('--workers', dest='workers', default=1, type='int',
help='Number of workers to spawn. [%default]'),
op.make_option('--log-level', dest='loglevel', default='info',
help='Log level below which to silence messages. [%default]'),
op.make_option('--log-file', dest='logfile', default='-',
help='Log to a file. - is stdout. [%default]')
]
def configure_logging(opts):
handlers = []
if opts.logfile != "-":
handlers.append(logging.FileHandler(opts.logfile))
else:
handlers.append(logging.StreamHandler())
loglevel = LOG_LEVELS.get(opts.loglevel.lower(), logging.INFO)
logger = logging.getLogger()
logger.setLevel(loglevel)
for h in handlers:
h.setFormatter(logging.Formatter("%(levelname)s %(message)s"))
logger.addHandler(h)
def main(usage, get_app):
parser = op.OptionParser(usage=usage, option_list=options())
opts, args = parser.parse_args()
configure_logging(opts)
app = get_app(parser, opts, args)
arbiter = Arbiter((opts.host, opts.port), opts.workers, app)
arbiter.run()