Remove logbook and replace it with logging.

This reverts commit 1ab8c19696 and
reintroduces all changes made by @dstufft.

Still, it needs more patches to reeanble the default log-to-console
behaviour.  See #121.
main
Vincent Driessen 12 years ago
parent db82d5c1b4
commit 879a87d158

@ -17,6 +17,8 @@
makes it possible to distinguish between a job that explicitly returned makes it possible to distinguish between a job that explicitly returned
`None` and a job that isn't finished yet (see `status` property). `None` and a job that isn't finished yet (see `status` property).
- Remove `logbook` dependency (in favor of `logging`)
- Custom exception handlers can now be configured in addition to, or to fully - Custom exception handlers can now be configured in addition to, or to fully
replace, moving failed jobs to the failed queue. Relevant documentation replace, moving failed jobs to the failed queue. Relevant documentation
[here](http://python-rq.org/docs/exceptions/) and [here](http://python-rq.org/docs/exceptions/) and

@ -1,4 +1,3 @@
redis redis
times times
logbook
argparse argparse

@ -1,42 +1,44 @@
#!/usr/bin/env python #!/usr/bin/env python
import sys import sys
import argparse import argparse
import logbook import logging
from logbook import handlers import logging.config
from rq import Queue, Worker from rq import Queue, Worker
from redis.exceptions import ConnectionError from redis.exceptions import ConnectionError
from rq.scripts import add_standard_arguments from rq.scripts import add_standard_arguments
from rq.scripts import setup_redis from rq.scripts import setup_redis
logger = logging.getLogger(__name__)
def format_colors(record, handler):
from rq.utils import make_colorizer
if record.level == logbook.WARNING:
colorize = make_colorizer('darkyellow')
elif record.level >= logbook.ERROR:
colorize = make_colorizer('darkred')
else:
colorize = lambda x: x
return '%s: %s' % (record.time.strftime('%H:%M:%S'), colorize(record.msg))
def setup_loghandlers(args): def setup_loghandlers(args):
if args.verbose: logging.config.dictConfig({
loglevel = logbook.DEBUG "version": 1,
formatter = None "disable_existing_loggers": False,
else:
loglevel = logbook.INFO "formatters": {
formatter = format_colors "console": {
"format": "%(asctime)s %(message)s",
handlers.NullHandler(bubble=False).push_application() "datefmt": "%H:%M:%S",
handler = handlers.StreamHandler(sys.stdout, level=loglevel, bubble=False) },
if formatter: },
handler.formatter = formatter
handler.push_application() "handlers": {
handler = handlers.StderrHandler(level=logbook.WARNING, bubble=False) "console": {
if formatter: "level": "DEBUG",
handler.formatter = formatter #"class": "logging.StreamHandler",
handler.push_application() "class": "rq.utils.ColorizingStreamHandler",
"formatter": "console",
"exclude": ["%(asctime)s"],
},
},
"root": {
"handlers": ["console"],
"level": "DEBUG" if args.verbose else "INFO"
}
})
def parse_args(): def parse_args():
@ -81,6 +83,7 @@ def main():
setup_loghandlers(args) setup_loghandlers(args)
setup_redis(args) setup_redis(args)
try: try:
queues = map(Queue, args.queues) queues = map(Queue, args.queues)
w = Worker(queues, name=args.name) w = Worker(queues, name=args.name)

@ -5,6 +5,7 @@ Miscellaneous helper functions.
The formatter for ANSI colored console output is heavily based on Pygments The formatter for ANSI colored console output is heavily based on Pygments
terminal colorizing code, originally by Georg Brandl. terminal colorizing code, originally by Georg Brandl.
""" """
import logging
import os import os
@ -115,3 +116,34 @@ def make_colorizer(color):
def inner(text): def inner(text):
return colorizer.colorize(color, text) return colorizer.colorize(color, text)
return inner return inner
class ColorizingStreamHandler(logging.StreamHandler):
levels = {
logging.WARNING: make_colorizer('darkyellow'),
logging.ERROR: make_colorizer('darkred'),
logging.CRITICAL: make_colorizer('darkred'),
}
def __init__(self, exclude=None, *args, **kwargs):
self.exclude = exclude
super(ColorizingStreamHandler, self).__init__(*args, **kwargs)
@property
def is_tty(self):
isatty = getattr(self.stream, 'isatty', None)
return isatty and isatty()
def format(self, record):
message = logging.StreamHandler.format(self, record)
if self.is_tty:
colorize = self.levels.get(record.levelno, lambda x: x)
# Don't colorize any traceback
parts = message.split('\n', 1)
parts[0] = " ".join([parts[0].split(" ", 1)[0], colorize(parts[0].split(" ", 1)[1])])
message = '\n'.join(parts)
return message

@ -11,12 +11,8 @@ except ImportError:
import socket import socket
import signal import signal
import traceback import traceback
import logging
from cPickle import dumps from cPickle import dumps
try:
from logbook import Logger
Logger = Logger # Does nothing except it shuts up pyflakes annoying error
except ImportError:
from logging import Logger
from .queue import Queue, get_failed_queue from .queue import Queue, get_failed_queue
from .connections import get_current_connection from .connections import get_current_connection
from .job import Status from .job import Status
@ -29,6 +25,8 @@ green = make_colorizer('darkgreen')
yellow = make_colorizer('darkyellow') yellow = make_colorizer('darkyellow')
blue = make_colorizer('darkblue') blue = make_colorizer('darkblue')
logger = logging.getLogger(__name__)
class StopRequested(Exception): class StopRequested(Exception):
pass pass
@ -112,7 +110,7 @@ class Worker(object):
self._is_horse = False self._is_horse = False
self._horse_pid = 0 self._horse_pid = 0
self._stopped = False self._stopped = False
self.log = Logger('worker') self.log = logger
self.failed_queue = get_failed_queue(connection=self.connection) self.failed_queue = get_failed_queue(connection=self.connection)
# By default, push the "move-to-failed-queue" exception handler onto # By default, push the "move-to-failed-queue" exception handler onto
@ -372,7 +370,7 @@ class Worker(object):
signal.signal(signal.SIGTERM, signal.SIG_DFL) signal.signal(signal.SIGTERM, signal.SIG_DFL)
self._is_horse = True self._is_horse = True
self.log = Logger('horse') self.log = logger
success = self.perform_job(job) success = self.perform_job(job)

@ -1,2 +1,2 @@
[bdist_rpm] [bdist_rpm]
requires = redis procname logbook requires = redis procname

@ -18,7 +18,6 @@ def get_version():
def get_dependencies(): def get_dependencies():
deps = ['redis >= 2.4.0', 'times'] deps = ['redis >= 2.4.0', 'times']
deps += ['logbook'] # should be soft dependency?
if sys.version_info < (2, 7) or \ if sys.version_info < (2, 7) or \
(sys.version_info >= (3, 0) and sys.version_info < (3, 1)): (sys.version_info >= (3, 0) and sys.version_info < (3, 1)):
deps += ['importlib'] deps += ['importlib']

@ -1,6 +1,7 @@
import logging
import unittest import unittest
from redis import Redis from redis import Redis
from logbook import NullHandler
from rq import push_connection, pop_connection from rq import push_connection, pop_connection
@ -47,9 +48,8 @@ class RQTestCase(unittest.TestCase):
# Store the connection (for sanity checking) # Store the connection (for sanity checking)
cls.testconn = testconn cls.testconn = testconn
# Shut up logbook # Shut up logging
cls.log_handler = NullHandler() logging.disable("ERROR")
cls.log_handler.push_thread()
def setUp(self): def setUp(self):
# Flush beforewards (we like our hygiene) # Flush beforewards (we like our hygiene)
@ -66,7 +66,7 @@ class RQTestCase(unittest.TestCase):
@classmethod @classmethod
def tearDownClass(cls): def tearDownClass(cls):
cls.log_handler.pop_thread() logging.disable(logging.NOTSET)
# Pop the connection to Redis # Pop the connection to Redis
testconn = pop_connection() testconn = pop_connection()

Loading…
Cancel
Save