From 67adc87e92e1adbaf5922a8801f1a0020ebafda1 Mon Sep 17 00:00:00 2001 From: Amrith Kumar Date: Mon, 30 Nov 2015 19:29:06 -0500 Subject: [PATCH] Change reporting of unhandled logging Unhandled logging messages generated from sources other than Trove's tests were flooding the log with numerous messages that included complete backtraces. These backtraces are over 150mb when you run tox -e py27. Unfortunately, while they are an indication of a problem, they are most often not things that can be fixed in the Trove project. To fix this, at least in the short term, this change only reports anything if the logged message is coming from the context of a test. Also, this change disables back traces in the messages being reported unless an optional enables_backtrace is set. By default it set to False and can only be enabled with a code change (i.e. no configuration setting). Change-Id: I9452f03bdd5365991e3c4831aa4936de3713612e Closes-Bug: 1521373 --- trove/tests/root_logger.py | 27 +++++++++++++++--------- trove/tests/unittests/trove_testtools.py | 2 +- 2 files changed, 18 insertions(+), 11 deletions(-) diff --git a/trove/tests/root_logger.py b/trove/tests/root_logger.py index 6909d78b86..92fa63e160 100644 --- a/trove/tests/root_logger.py +++ b/trove/tests/root_logger.py @@ -22,15 +22,17 @@ class DefaultRootHandler(logging.StreamHandler): __handler = logging.StreamHandler() __singleton = None __info = None + __enable_backtrace = False @classmethod - def activate(cls): + def activate(cls, enable_backtrace=False): # leverage the singleton __handler which has an # acquire() method to create a critical section. cls.__handler.acquire() if cls.__singleton is None: cls.__singleton = DefaultRootHandler() + cls.__enable_backtrace = enable_backtrace cls.__handler.release() return cls.__singleton @@ -47,21 +49,26 @@ class DefaultRootHandler(logging.StreamHandler): super(DefaultRootHandler, self).__init__() def emit(self, record): - msg = ("[" + record.name + "]\n" + - self.format(record) + "\n" + - (("\tFrom: " + DefaultRootHandler.__info + "\n") - if DefaultRootHandler.__info - else (''.join(traceback.format_stack())))) - self.stream.write(msg) - self.flush() + if DefaultRootHandler.__info: + msg = ("*************************\n" + + "Unhandled message logged from " + + DefaultRootHandler.__info + ", " + + record.name + "\n") + + if DefaultRootHandler.__enable_backtrace: + msg += ''.join(traceback.format_stack()) + "\n" + + msg += "*************************\n" + self.stream.write(msg) + self.flush() class DefaultRootLogger(object): """A root logger that uses the singleton handler""" - def __init__(self): + def __init__(self, enable_backtrace=False): super(DefaultRootLogger, self).__init__() - handler = DefaultRootHandler.activate() + handler = DefaultRootHandler.activate(enable_backtrace=False) handler.acquire() if handler not in logging.getLogger('').handlers: diff --git a/trove/tests/unittests/trove_testtools.py b/trove/tests/unittests/trove_testtools.py index 60b66a85be..9213b64e9f 100644 --- a/trove/tests/unittests/trove_testtools.py +++ b/trove/tests/unittests/trove_testtools.py @@ -44,7 +44,7 @@ class TestCase(testtools.TestCase): 'TROVE_TESTS_UNMOCK_ONLY_UNIQUE', True)) cls._dangling_mocks = set() - root_logger.DefaultRootLogger() + root_logger.DefaultRootLogger(enable_backtrace=False) @classmethod def is_bool(cls, val):