From bf0909669d9c931cf7ba3b357d749cebbbbae91b Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 2 Jun 2015 19:12:56 +0530 Subject: [PATCH] Ensure exception tracebacks are logged in the server log --- src/calibre/srv/tests/base.py | 15 +++------------ src/calibre/srv/utils.py | 10 ++++++++-- src/calibre/utils/logging.py | 3 ++- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/calibre/srv/tests/base.py b/src/calibre/srv/tests/base.py index a5c4422fc0..2ea55cf60b 100644 --- a/src/calibre/srv/tests/base.py +++ b/src/calibre/srv/tests/base.py @@ -7,12 +7,10 @@ __license__ = 'GPL v3' __copyright__ = '2011, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import unittest, shutil, time, httplib, traceback -from functools import partial +import unittest, time, httplib from threading import Thread -from calibre.utils.logging import ThreadSafeLog -rmtree = partial(shutil.rmtree, ignore_errors=True) +from calibre.srv.utils import ServerLog class BaseTest(unittest.TestCase): @@ -21,13 +19,6 @@ class BaseTest(unittest.TestCase): ae = unittest.TestCase.assertEqual -class TestLog(ThreadSafeLog): - - def exception(self, *args, **kwargs): - limit = kwargs.pop('limit', None) - self.prints(self.ERROR, *args, **kwargs) - self.prints(self.WARN, traceback.format_exc(limit)) - class TestServer(Thread): daemon = True @@ -43,7 +34,7 @@ class TestServer(Thread): self.loop = ServerLoop( create_http_handler(handler), opts=Options(**kwargs), - log=TestLog(level=ThreadSafeLog.WARN), + log=ServerLog(level=ServerLog.WARN), ) self.log = self.loop.log diff --git a/src/calibre/srv/utils.py b/src/calibre/srv/utils.py index 8291f6e40b..b11648559a 100644 --- a/src/calibre/srv/utils.py +++ b/src/calibre/srv/utils.py @@ -178,6 +178,11 @@ def eintr_retry_call(func, *args, **kwargs): continue raise +# Logging {{{ + +class ServerLog(ThreadSafeLog): + exception_traceback_level = ThreadSafeLog.WARN + class RotatingStream(object): def __init__(self, filename, max_size=None, history=5): @@ -215,11 +220,12 @@ class RotatingStream(object): atomic_rename(self.filename, '%s.%d' % (self.filename, 1)) self.set_output() -class RotatingLog(ThreadSafeLog): +class RotatingLog(ServerLog): def __init__(self, filename, max_size=None, history=5): - ThreadSafeLog.__init__(self) + ServerLog.__init__(self) self.outputs = [RotatingStream(filename, max_size, history)] +# }}} class HandleInterrupt(object): # {{{ diff --git a/src/calibre/utils/logging.py b/src/calibre/utils/logging.py index 2296d47cf8..4f85744911 100644 --- a/src/calibre/utils/logging.py +++ b/src/calibre/utils/logging.py @@ -166,6 +166,7 @@ class DevNull(Log): self.outputs = [] class ThreadSafeLog(Log): + exception_traceback_level = Log.DEBUG def __init__(self, level=Log.INFO): Log.__init__(self, level=level) @@ -179,7 +180,7 @@ class ThreadSafeLog(Log): limit = kwargs.pop('limit', None) with self._lock: Log.prints(self, ERROR, *args, **kwargs) - Log.prints(self, DEBUG, traceback.format_exc(limit)) + Log.prints(self, self.exception_traceback_level, traceback.format_exc(limit)) class ThreadSafeWrapper(Log):