Skip to content

Commit 381ddc6

Browse files
authored
Merge pull request #5 from marselester/exc-log
Exception logging
2 parents 4c64d5b + c166589 commit 381ddc6

File tree

4 files changed

+29
-2
lines changed

4 files changed

+29
-2
lines changed

README.rst

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ Usage example:
2727
2828
logger.info('Sign up', extra={'referral_code': '52d6ce'})
2929
30+
try:
31+
raise ValueError('something wrong')
32+
except ValueError:
33+
logger.error('Request failed', exc_info=True)
34+
3035
The log file will contain the following log record (inline).
3136

3237
.. code-block:: json
@@ -36,6 +41,11 @@ The log file will contain the following log record (inline).
3641
"time": "2015-09-01T06:06:26.524448",
3742
"referral_code": "52d6ce"
3843
}
44+
{
45+
"message": "Request failed",
46+
"time": "2015-09-01T06:06:26.524449",
47+
"exc_info": "Traceback (most recent call last): ..."
48+
}
3949
4050
JSON libraries
4151
--------------

json_log_formatter/__init__.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ class JSONFormatter(logging.Formatter):
5555
}
5656
5757
"""
58+
5859
json_lib = json
5960

6061
def format(self, record):
@@ -70,9 +71,10 @@ def format(self, record):
7071
return self.to_json(mutated_record)
7172

7273
def to_json(self, record):
73-
"""Convert record dict to a json string
74+
"""Converts record dict to a JSON string.
7475
7576
Override this method to change the way dict is converted to JSON.
77+
7678
"""
7779
return self.json_lib.dumps(record)
7880

@@ -104,6 +106,10 @@ def json_record(self, message, extra, record):
104106
extra['message'] = message
105107
if 'time' not in extra:
106108
extra['time'] = datetime.utcnow()
109+
110+
if record.exc_info:
111+
extra['exc_info'] = self.formatException(record.exc_info)
112+
107113
return extra
108114

109115
def mutate_json_record(self, json_record):

tests.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,17 @@ def test_message_and_time_and_extra_are_in_json_record_when_extra_is_provided(se
6464
])
6565
self.assertEqual(set(json_record), expected_fields)
6666

67+
def test_exc_info_is_logged(self):
68+
try:
69+
raise ValueError('something wrong')
70+
except ValueError:
71+
logger.error('Request failed', exc_info=True)
72+
json_record = json.loads(log_buffer.getvalue())
73+
self.assertIn(
74+
'Traceback (most recent call last)',
75+
json_record['exc_info']
76+
)
77+
6778

6879
class MutatingFormatter(JSONFormatter):
6980
def mutate_json_record(self, json_record):

tox.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,4 +7,4 @@ deps=
77
ujson
88
simplejson
99
commands=
10-
pytest tests.py
10+
pytest -s tests.py

0 commit comments

Comments
 (0)