Skip to content
This repository was archived by the owner on Dec 21, 2024. It is now read-only.

Commit 63873c1

Browse files
committed
Add extendable JsonEncoder class w/ existing default func from __init__
1 parent e356f41 commit 63873c1

File tree

1 file changed

+25
-12
lines changed

1 file changed

+25
-12
lines changed

src/pythonjsonlogger/jsonlogger.py

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import logging
66
import json
77
import re
8-
import datetime
8+
from datetime import date, datetime, time
99
import traceback
1010

1111
from inspect import istraceback
@@ -44,6 +44,28 @@ def merge_record_extra(record, target, reserved=RESERVED_ATTR_HASH):
4444
return target
4545

4646

47+
class JsonEncoder(json.JSONEncoder):
48+
"""
49+
A custom encoder extending the default JSONEncoder
50+
"""
51+
def default(self, obj):
52+
if isinstance(obj, (date, datetime, time)):
53+
return self.format_datetime_obj(obj)
54+
55+
elif istraceback(obj):
56+
return ''.join(traceback.format_tb(obj)).strip()
57+
58+
elif type(obj) == Exception \
59+
or isinstance(obj, Exception) \
60+
or type(obj) == type:
61+
return str(obj)
62+
63+
return super(JsonEncoder, self).default(obj)
64+
65+
def format_datetime_obj(self, obj):
66+
return obj.isoformat()
67+
68+
4769
class JsonFormatter(logging.Formatter):
4870
"""
4971
A custom formatter to format logging records as json strings.
@@ -69,17 +91,8 @@ def __init__(self, *args, **kwargs):
6991
#super(JsonFormatter, self).__init__(*args, **kwargs)
7092
logging.Formatter.__init__(self, *args, **kwargs)
7193
if not self.json_encoder and not self.json_default:
72-
def _default_json_handler(obj):
73-
'''Prints dates in ISO format'''
74-
if isinstance(obj, (datetime.date, datetime.time)):
75-
return obj.isoformat()
76-
elif istraceback(obj):
77-
tb = ''.join(traceback.format_tb(obj))
78-
return tb.strip()
79-
elif isinstance(obj, Exception):
80-
return "Exception: %s" % str(obj)
81-
return str(obj)
82-
self.json_default = _default_json_handler
94+
self.json_encoder = JsonEncoder
95+
8396
self._required_fields = self.parse()
8497
self._skip_fields = dict(zip(self._required_fields,
8598
self._required_fields))

0 commit comments

Comments
 (0)