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

Commit b606080

Browse files
committed
Added ability to customise JSON dictionary
1 parent d154bef commit b606080

File tree

2 files changed

+31
-6
lines changed

2 files changed

+31
-6
lines changed

src/jsonlogger.py

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -85,11 +85,27 @@ def parse(self):
8585
standard_formatters = re.compile(r'\((.+?)\)', re.IGNORECASE)
8686
return standard_formatters.findall(self._fmt)
8787

88+
def add_fields(self, log_record, record, message_dict):
89+
"""
90+
Override this method to implement custom logic for adding fields.
91+
"""
92+
for field in self._required_fields:
93+
log_record[field] = record.__dict__.get(field)
94+
log_record.update(message_dict)
95+
merge_record_extra(record, log_record, reserved=self._skip_fields)
96+
97+
def process_log_record(self, log_record):
98+
"""
99+
Override this method to implement custom logic
100+
on the possibly ordered dictionary.
101+
"""
102+
return log_record
103+
88104
def format(self, record):
89105
"""Formats a log record and serializes to json"""
90-
extras = {}
106+
message_dict = {}
91107
if isinstance(record.msg, dict):
92-
extras = record.msg
108+
message_dict = record.msg
93109
record.message = None
94110
else:
95111
record.message = record.getMessage()
@@ -102,10 +118,8 @@ def format(self, record):
102118
except NameError:
103119
log_record = {}
104120

105-
for field in self._required_fields:
106-
log_record[field] = record.__dict__.get(field)
107-
log_record.update(extras)
108-
merge_record_extra(record, log_record, reserved=self._skip_fields)
121+
self.add_fields(log_record, record, message_dict)
122+
self.process_log_record(log_record)
109123

110124
return "%s%s" % (self.prefix,
111125
json.dumps(log_record,

tests/tests.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,17 @@ def custom(o):
141141
self.assertEqual(logJson.get("adate"), "very custom")
142142
self.assertEqual(logJson.get("normal"), "value")
143143

144+
def testJsonCustomLogicAddsField(self):
145+
class CustomJsonFormatter(jsonlogger.JsonFormatter):
146+
147+
def process_log_record(self, log_record):
148+
log_record["custom"] = "value"
149+
150+
self.logHandler.setFormatter(CustomJsonFormatter())
151+
self.logger.info("message")
152+
logJson = json.loads(self.buffer.getvalue())
153+
self.assertEqual(logJson.get("custom"), "value")
154+
144155

145156
if __name__ == '__main__':
146157
if len(sys.argv[1:]) > 0:

0 commit comments

Comments
 (0)