From aa30df9e26802a385ba1ba6498e4d52ec3000318 Mon Sep 17 00:00:00 2001 From: "Paul J. Davis" Date: Sun, 17 Jan 2010 12:33:45 -0500 Subject: [PATCH] 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. --- .gitignore | 1 + bin/gunicorn | 36 ++++++-------------- bin/gunicorn_django | 31 +++-------------- gunicorn/__init__.py | 2 -- gunicorn/arbiter.py | 1 - gunicorn/main.py | 79 ++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 96 insertions(+), 54 deletions(-) mode change 100644 => 100755 bin/gunicorn_django create mode 100644 gunicorn/main.py diff --git a/.gitignore b/.gitignore index 5e9b59ee..9b8551ce 100755 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ *.gem *.swp *.pyc +*#* build dist setuptools-* diff --git a/bin/gunicorn b/bin/gunicorn index a5606e18..e05b3bc1 100755 --- a/bin/gunicorn +++ b/bin/gunicorn @@ -25,38 +25,24 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. -import optparse as op import os import sys sys.path.insert(0, os.getcwd()) -import gunicorn -from gunicorn import util +from gunicorn.main import main +from gunicorn.util import import_app __usage__ = "%prog [OPTIONS] APP_MODULE" -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]') - ] - -def main(): - parser = op.OptionParser(usage=__usage__, option_list=options()) - opts, args = parser.parse_args() - +def get_app(parser, opts, args): if len(args) != 1: parser.error("No application module specified.") - - app = util.import_app(args[0]) - - arbiter = gunicorn.Arbiter((opts.host, opts.port), opts.workers, app) - arbiter.run() - -if __name__ == '__main__': - main() + + try: + return import_app(args[0]) + except: + parser.error("Failed to import application module.") + +main(__usage__, get_app) + diff --git a/bin/gunicorn_django b/bin/gunicorn_django old mode 100644 new mode 100755 index 39e6df5c..dda54c43 --- a/bin/gunicorn_django +++ b/bin/gunicorn_django @@ -25,12 +25,8 @@ # FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR # OTHER DEALINGS IN THE SOFTWARE. -import optparse as op -import os -import sys - import django.core.handlers.wsgi -import gunicorn +from gunicorn.main import main __usage__ = "%prog [OPTIONS]" @@ -41,25 +37,8 @@ PROJECT_NAME = os.path.split(PROJECT_PATH)[-1] sys.path.insert(0, os.path.join(PROJECT_PATH, "..")) os.environ['DJANGO_SETTINGS_MODULE'] = '%s.settings' % PROJECT_NAME -# django wsgi app -app = django.core.handlers.wsgi.WSGIHandler() +def get_app(parser, opts, args): + # django wsgi app + return django.core.handlers.wsgi.WSGIHandler() -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]') - ] - -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() +main(__usage__, get_app) diff --git a/gunicorn/__init__.py b/gunicorn/__init__.py index 4c6e6080..299982df 100644 --- a/gunicorn/__init__.py +++ b/gunicorn/__init__.py @@ -25,5 +25,3 @@ # OTHER DEALINGS IN THE SOFTWARE. __version__ = "0.1" - -from arbiter import Arbiter \ No newline at end of file diff --git a/gunicorn/arbiter.py b/gunicorn/arbiter.py index b5210fc4..666e39fb 100644 --- a/gunicorn/arbiter.py +++ b/gunicorn/arbiter.py @@ -36,7 +36,6 @@ import time from worker import Worker -logging.basicConfig(level=logging.DEBUG, format="%(levelname)s: %(message)s") log = logging.getLogger(__name__) class Arbiter(object): diff --git a/gunicorn/main.py b/gunicorn/main.py new file mode 100644 index 00000000..a7cad1d6 --- /dev/null +++ b/gunicorn/main.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 - +# +# 2009 (c) Benoit Chesneau +# 2009 (c) Paul J. Davis +# +# 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() +