summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES4
-rw-r--r--raven/handlers/logging.py2
-rwxr-xr-xsetup.py2
-rw-r--r--tests/handlers/logging/tests.py102
4 files changed, 61 insertions, 49 deletions
diff --git a/CHANGES b/CHANGES
index d191e81..d1cae38 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,7 @@
+1.3.2
+
+* Support sending the culprit with logging messages as part of extra.
+
1.3.1
* Added client.exception and client.message shortcuts.
diff --git a/raven/handlers/logging.py b/raven/handlers/logging.py
index 1df7bab..4e7325d 100644
--- a/raven/handlers/logging.py
+++ b/raven/handlers/logging.py
@@ -70,7 +70,7 @@ class SentryHandler(logging.Handler, object):
data = {}
for k, v in record.__dict__.iteritems():
- if '.' not in k:
+ if '.' not in k and k not in ('culprit',):
continue
data[k] = v
diff --git a/setup.py b/setup.py
index 9a016a0..28f59f8 100755
--- a/setup.py
+++ b/setup.py
@@ -32,7 +32,7 @@ install_requires = [
setup(
name='raven',
- version='1.3.1',
+ version='1.3.2',
author='David Cramer',
author_email='dcramer@gmail.com',
url='http://github.com/dcramer/raven',
diff --git a/tests/handlers/logging/tests.py b/tests/handlers/logging/tests.py
index 936801d..f7ca3be 100644
--- a/tests/handlers/logging/tests.py
+++ b/tests/handlers/logging/tests.py
@@ -14,22 +14,19 @@ class TempStoreClient(Client):
self.events.append(kwargs)
-class LoggingHandlerTest(TestCase):
+class LoggingIntegrationTest(TestCase):
def setUp(self):
+ self.client = TempStoreClient(include_paths=['tests', 'raven'])
+ self.handler = SentryHandler(self.client)
self.logger = logging.getLogger(__name__)
+ self.logger.handlers = []
+ self.logger.addHandler(self.handler)
- def test_logger(self):
- client = TempStoreClient(include_paths=['tests', 'raven'])
- handler = SentryHandler(client)
-
- logger = self.logger
- logger.handlers = []
- logger.addHandler(handler)
+ def test_logger_basic(self):
+ self.logger.error('This is a test error')
- logger.error('This is a test error')
-
- self.assertEquals(len(client.events), 1)
- event = client.events.pop(0)
+ self.assertEquals(len(self.client.events), 1)
+ event = self.client.events.pop(0)
self.assertEquals(event['logger'], __name__)
self.assertEquals(event['level'], logging.ERROR)
self.assertEquals(event['message'], 'This is a test error')
@@ -40,9 +37,10 @@ class LoggingHandlerTest(TestCase):
self.assertEquals(msg['message'], 'This is a test error')
self.assertEquals(msg['params'], ())
- logger.warning('This is a test warning')
- self.assertEquals(len(client.events), 1)
- event = client.events.pop(0)
+ def test_logger_warning(self):
+ self.logger.warning('This is a test warning')
+ self.assertEquals(len(self.client.events), 1)
+ event = self.client.events.pop(0)
self.assertEquals(event['logger'], __name__)
self.assertEquals(event['level'], logging.WARNING)
self.assertEquals(event['message'], 'This is a test warning')
@@ -53,13 +51,14 @@ class LoggingHandlerTest(TestCase):
self.assertEquals(msg['message'], 'This is a test warning')
self.assertEquals(msg['params'], ())
- logger.info('This is a test info with a url', extra=dict(
+ def test_logger_extra_data(self):
+ self.logger.info('This is a test info with a url', extra=dict(
data=dict(
url='http://example.com',
),
))
- self.assertEquals(len(client.events), 1)
- event = client.events.pop(0)
+ self.assertEquals(len(self.client.events), 1)
+ event = self.client.events.pop(0)
self.assertEquals(event['extra']['url'], 'http://example.com')
self.assertFalse('sentry.interfaces.Stacktrace' in event)
self.assertFalse('sentry.interfaces.Exception' in event)
@@ -68,13 +67,14 @@ class LoggingHandlerTest(TestCase):
self.assertEquals(msg['message'], 'This is a test info with a url')
self.assertEquals(msg['params'], ())
+ def test_logger_exc_info(self):
try:
raise ValueError('This is a test ValueError')
except ValueError:
- logger.info('This is a test info with an exception', exc_info=True)
+ self.logger.info('This is a test info with an exception', exc_info=True)
- self.assertEquals(len(client.events), 1)
- event = client.events.pop(0)
+ self.assertEquals(len(self.client.events), 1)
+ event = self.client.events.pop(0)
self.assertEquals(event['message'], 'This is a test info with an exception')
self.assertTrue('sentry.interfaces.Stacktrace' in event)
@@ -87,10 +87,22 @@ class LoggingHandlerTest(TestCase):
self.assertEquals(msg['message'], 'This is a test info with an exception')
self.assertEquals(msg['params'], ())
- # test stacks
- logger.info('This is a test of stacks', extra={'stack': True})
- self.assertEquals(len(client.events), 1)
- event = client.events.pop(0)
+ def test_message_params(self):
+ self.logger.info('This is a test of %s', 'args')
+ self.assertEquals(len(self.client.events), 1)
+ event = self.client.events.pop(0)
+ self.assertEquals(event['message'], 'This is a test of args')
+ self.assertFalse('sentry.interfaces.Stacktrace' in event)
+ self.assertFalse('sentry.interfaces.Exception' in event)
+ self.assertTrue('sentry.interfaces.Message' in event)
+ msg = event['sentry.interfaces.Message']
+ self.assertEquals(msg['message'], 'This is a test of %s')
+ self.assertEquals(msg['params'], ('args',))
+
+ def test_record_stack(self):
+ self.logger.info('This is a test of stacks', extra={'stack': True})
+ self.assertEquals(len(self.client.events), 1)
+ event = self.client.events.pop(0)
self.assertTrue('sentry.interfaces.Stacktrace' in event)
frames = event['sentry.interfaces.Stacktrace']['frames']
self.assertNotEquals(len(frames), 1)
@@ -101,13 +113,13 @@ class LoggingHandlerTest(TestCase):
msg = event['sentry.interfaces.Message']
self.assertEquals(msg['message'], 'This is a test of stacks')
self.assertEquals(msg['params'], ())
- self.assertEquals(event['culprit'], 'tests.handlers.logging.tests.test_logger')
+ self.assertEquals(event['culprit'], 'tests.handlers.logging.tests.test_record_stack')
self.assertEquals(event['message'], 'This is a test of stacks')
- # test no stacks
- logger.info('This is a test of no stacks', extra={'stack': False})
- self.assertEquals(len(client.events), 1)
- event = client.events.pop(0)
+ def test_no_record_stack(self):
+ self.logger.info('This is a test of no stacks', extra={'stack': False})
+ self.assertEquals(len(self.client.events), 1)
+ event = self.client.events.pop(0)
self.assertEquals(event.get('culprit'), None)
self.assertEquals(event['message'], 'This is a test of no stacks')
self.assertFalse('sentry.interfaces.Stacktrace' in event)
@@ -117,23 +129,11 @@ class LoggingHandlerTest(TestCase):
self.assertEquals(msg['message'], 'This is a test of no stacks')
self.assertEquals(msg['params'], ())
- # test args
- logger.info('This is a test of %s', 'args')
- self.assertEquals(len(client.events), 1)
- event = client.events.pop(0)
- self.assertEquals(event['message'], 'This is a test of args')
- self.assertFalse('sentry.interfaces.Stacktrace' in event)
- self.assertFalse('sentry.interfaces.Exception' in event)
- self.assertTrue('sentry.interfaces.Message' in event)
- msg = event['sentry.interfaces.Message']
- self.assertEquals(msg['message'], 'This is a test of %s')
- self.assertEquals(msg['params'], ('args',))
-
- # test explicit stack
- logger.info('This is a test of stacks', extra={'stack': iter_stack_frames()})
- self.assertEquals(len(client.events), 1)
- event = client.events.pop(0)
- self.assertEquals(event['culprit'], 'tests.handlers.logging.tests.test_logger')
+ def test_explicit_stack(self):
+ self.logger.info('This is a test of stacks', extra={'stack': iter_stack_frames()})
+ self.assertEquals(len(self.client.events), 1)
+ event = self.client.events.pop(0)
+ self.assertEquals(event['culprit'], 'tests.handlers.logging.tests.test_explicit_stack')
self.assertEquals(event['message'], 'This is a test of stacks')
self.assertFalse('sentry.interfaces.Exception' in event)
self.assertTrue('sentry.interfaces.Message' in event)
@@ -142,6 +142,14 @@ class LoggingHandlerTest(TestCase):
self.assertEquals(msg['params'], ())
self.assertTrue('sentry.interfaces.Stacktrace' in event)
+ def test_extra_culprit(self):
+ self.logger.info('This is a test of stacks', extra={'culprit': 'foo.bar'})
+ self.assertEquals(len(self.client.events), 1)
+ event = self.client.events.pop(0)
+ self.assertEquals(event['culprit'], 'foo.bar')
+
+
+class LoggingHandlerTest(TestCase):
def test_client_arg(self):
client = TempStoreClient(include_paths=['tests'])
handler = SentryHandler(client)