diff options
| -rw-r--r-- | debug_toolbar/panels/logger.py | 9 | ||||
| -rw-r--r-- | tests/tests.py | 47 | 
2 files changed, 55 insertions, 1 deletions
| diff --git a/debug_toolbar/panels/logger.py b/debug_toolbar/panels/logger.py index c6c1bd1..2c749ce 100644 --- a/debug_toolbar/panels/logger.py +++ b/debug_toolbar/panels/logger.py @@ -9,6 +9,8 @@ except ImportError:  from django.utils.translation import ungettext, ugettext_lazy as _  from debug_toolbar.panels import DebugPanel +MESSAGE_IF_STRING_REPRESENTATION_INVALID = '[Could not get log message]' +  class LogCollector(object):      def __init__(self): @@ -49,8 +51,13 @@ class ThreadTrackingHandler(logging.Handler):          self.collector = collector      def emit(self, record): +        try: +            message = record.getMessage() +        except Exception: +            message = MESSAGE_IF_STRING_REPRESENTATION_INVALID +          record = { -            'message': record.getMessage(), +            'message': message,              'time': datetime.datetime.fromtimestamp(record.created),              'level': record.levelname,              'file': record.pathname, diff --git a/tests/tests.py b/tests/tests.py index 1571800..aac41bd 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -2,6 +2,7 @@  from __future__ import unicode_literals +import logging  import threading  import django @@ -15,6 +16,8 @@ from django.utils import six  from django.utils import unittest  from debug_toolbar.middleware import DebugToolbarMiddleware +from debug_toolbar.panels.logger import (LoggingPanel, +    MESSAGE_IF_STRING_REPRESENTATION_INVALID)  from debug_toolbar.panels.sql import SQLDebugPanel  from debug_toolbar.panels.request_vars import RequestVarsDebugPanel  from debug_toolbar.panels.template import TemplateDebugPanel @@ -287,3 +290,47 @@ class TemplatePanelTestCase(BaseTestCase):          ctx = template_panel.templates[0]['context'][base_ctx_idx]          self.assertIn('<<queryset of auth.User>>', ctx)          self.assertIn('<<triggers database query>>', ctx) + + +class LoggingPanelTestCase(BaseTestCase): +    def test_happy_case(self): +        logger = logging.getLogger(__name__) +        logger.info('Nothing to see here, move along!') + +        logging_panel = self.toolbar.get_panel(LoggingPanel) +        logging_panel.process_response(None, None) +        records = logging_panel.get_stats()['records'] + +        self.assertEqual(1, len(records)) +        self.assertEqual('Nothing to see here, move along!', +                         records[0]['message']) + +    def test_formatting(self): +        logger = logging.getLogger(__name__) +        logger.info('There are %d %s', 5, 'apples') + +        logging_panel = self.toolbar.get_panel(LoggingPanel) +        logging_panel.process_response(None, None) +        records = logging_panel.get_stats()['records'] + +        self.assertEqual(1, len(records)) +        self.assertEqual('There are 5 apples', +                         records[0]['message']) + +    def test_failing_formatting(self): +        class BadClass(object): +            def __str__(self): +                raise Exception('Please not stringify me!') + +        logger = logging.getLogger(__name__) + +        # should not raise exception, but fail silently +        logger.debug('This class is misbehaving: %s', BadClass()) + +        logging_panel = self.toolbar.get_panel(LoggingPanel) +        logging_panel.process_response(None, None) +        records = logging_panel.get_stats()['records'] + +        self.assertEqual(1, len(records)) +        self.assertEqual(MESSAGE_IF_STRING_REPRESENTATION_INVALID, +                         records[0]['message']) | 
