summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Ronacher <armin.ronacher@active-4.com>2016-05-14 02:37:25 +0200
committerArmin Ronacher <armin.ronacher@active-4.com>2016-05-14 02:37:25 +0200
commit9054fdd3ce06f81fc4995d95e0649dae513503d7 (patch)
treed4292bc894d6189fbe0c57e1d276ab3a31243627
parentc3e3e4dcbb1459e8b93be3bddca4cbcbdb971362 (diff)
parentc4293b4e0f99e6550446e7e66825984935c6a2c1 (diff)
downloadraven-9054fdd3ce06f81fc4995d95e0649dae513503d7.tar.gz
Merge pull request #767 from getsentry/bugfix/resiliant-log
More resilient log reporting.
-rw-r--r--raven/breadcrumbs.py25
-rw-r--r--tests/breadcrumbs/tests.py12
2 files changed, 32 insertions, 5 deletions
diff --git a/raven/breadcrumbs.py b/raven/breadcrumbs.py
index a0c91a6..803c9c5 100644
--- a/raven/breadcrumbs.py
+++ b/raven/breadcrumbs.py
@@ -11,6 +11,9 @@ from raven.utils import once
special_logger_handlers = {}
+logger = logging.getLogger('raven')
+
+
class BreadcrumbBuffer(object):
def __init__(self, limit=100):
@@ -39,9 +42,13 @@ class BreadcrumbBuffer(object):
rv = []
for idx, (payload, processor) in enumerate(self.buffer):
if processor is not None:
- processor(payload)
+ try:
+ processor(payload)
+ except Exception:
+ logger.exception('Failed to process breadcrumbs. Ignored')
self.buffer[idx] = (payload, None)
- rv.append(payload)
+ if payload is not None:
+ rv.append(payload)
return rv
@@ -78,9 +85,17 @@ def _record_log_breadcrumb(logger, level, msg, *args, **kwargs):
return
def processor(data):
- formatted_msg = text_type(msg)
- if args:
- formatted_msg = msg % args
+ formatted_msg = msg
+
+ # If people log bad things, this can happen. Then just don't do
+ # anything.
+ try:
+ formatted_msg = text_type(msg)
+ if args:
+ formatted_msg = msg % args
+ except Exception:
+ pass
+
# We do not want to include exc_info as argument because it often
# lies (set to a constant value like 1 or True) or even if it's a
# tuple it will not be particularly useful for us as we cannot
diff --git a/tests/breadcrumbs/tests.py b/tests/breadcrumbs/tests.py
index ab424d8..00fd463 100644
--- a/tests/breadcrumbs/tests.py
+++ b/tests/breadcrumbs/tests.py
@@ -56,3 +56,15 @@ class BreadcrumbTestCase(TestCase):
assert int(items[3]) == lineno
assert items[4] == 'INFO'
assert items[5] == 'Hello World!'
+
+ def test_broken_logging(self):
+ client = Client('http://foo:bar@example.com/0')
+ with client.context:
+ log = logging.getLogger('whatever.foo')
+ log.info('This is a message with %s. %s!', 42)
+ crumbs = client.context.breadcrumbs.get_buffer()
+
+ assert len(crumbs) == 1
+ assert crumbs[0]['type'] == 'default'
+ assert crumbs[0]['category'] == 'whatever.foo'
+ assert crumbs[0]['message'] == 'This is a message with %s. %s!'