Install a qualified except hook.

Fixes bug 1031351.

As an Exception is raised, it was not visible in the log, because
it wasn't qualified. The fix sets up the exception hook to be
qualified as the product_name.

Change-Id: Ie8061d003b05ea8b00db5d8ed8fa445ccc822942
This commit is contained in:
Mate Lakat
2012-07-31 17:53:57 +01:00
parent 98666a201a
commit 3cac24b06c
2 changed files with 35 additions and 6 deletions

View File

@@ -257,16 +257,18 @@ class PublishErrorsHandler(logging.Handler):
dict(error=record.msg))
def handle_exception(type, value, tb):
extra = {}
if CONF.verbose:
extra['exc_info'] = (type, value, tb)
getLogger().critical(str(value), **extra)
def _create_logging_excepthook(product_name):
def logging_excepthook(type, value, tb):
extra = {}
if CONF.verbose:
extra['exc_info'] = (type, value, tb)
getLogger(product_name).critical(str(value), **extra)
return logging_excepthook
def setup(product_name):
"""Setup logging."""
sys.excepthook = handle_exception
sys.excepthook = _create_logging_excepthook(product_name)
if CONF.log_config:
try:

View File

@@ -1,7 +1,9 @@
import cStringIO
import exceptions
import logging
import subprocess
import sys
import textwrap
from openstack.common import context
from openstack.common import cfg
@@ -219,6 +221,31 @@ class LegacyFormatterTestCase(test_utils.BaseTestCase):
self.assertEqual("NOCTXT: baz --DBG\n", self.stream.getvalue())
class ExceptionLoggingTestCase(test_utils.BaseTestCase):
"""Test that Exceptions are logged"""
def test_excepthook_logs_exception(self):
code = textwrap.dedent("""
import sys
from openstack.common import log as logging
logging.setup('somename')
raise Exception('Some error happened')
""")
child = subprocess.Popen([
sys.executable, "-"],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
(out, err) = child.communicate(input=code)
self.assertTrue(
"CRITICAL somename [-] Some error happened",
msg="Exception is not logged")
class FancyRecordTestCase(test_utils.BaseTestCase):
"""Test how we handle fancy record keys that are not in the
base python logging"""