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

Commit 7b80d44

Browse files
Fix rename_fields for exc_info (#160)
* test that exc_info rename works * test renaming of nonexistent key * fix renaming of fields
1 parent 51e07af commit 7b80d44

File tree

2 files changed

+40
-12
lines changed

2 files changed

+40
-12
lines changed

src/pythonjsonlogger/jsonlogger.py

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,8 @@ def add_fields(self, log_record: Dict[str, Any], record: logging.LogRecord, mess
168168
Override this method to implement custom logic for adding fields.
169169
"""
170170
for field in self._required_fields:
171-
if field in self.rename_fields:
172-
log_record[self.rename_fields[field]] = record.__dict__.get(field)
173-
else:
174-
log_record[field] = record.__dict__.get(field)
171+
log_record[field] = record.__dict__.get(field)
172+
175173
log_record.update(self.static_fields)
176174
log_record.update(message_dict)
177175
merge_record_extra(record, log_record, reserved=self._skip_fields)
@@ -180,6 +178,13 @@ def add_fields(self, log_record: Dict[str, Any], record: logging.LogRecord, mess
180178
key = self.timestamp if type(self.timestamp) == str else 'timestamp'
181179
log_record[key] = datetime.fromtimestamp(record.created, tz=timezone.utc)
182180

181+
self._perform_rename_log_fields(log_record)
182+
183+
def _perform_rename_log_fields(self, log_record):
184+
for old_field_name, new_field_name in self.rename_fields.items():
185+
log_record[new_field_name] = log_record[old_field_name]
186+
del log_record[old_field_name]
187+
183188
def process_log_record(self, log_record):
184189
"""
185190
Override this method to implement custom logic

tests/tests.py

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,16 @@ def test_rename_base_field(self):
6262

6363
self.assertEqual(log_json["@message"], msg)
6464

65+
def test_rename_nonexistent_field(self):
66+
fr = jsonlogger.JsonFormatter(rename_fields={'nonexistent_key': 'new_name'})
67+
self.log_handler.setFormatter(fr)
68+
69+
stderr_watcher = StringIO()
70+
sys.stderr = stderr_watcher
71+
self.log.info("testing logging rename")
72+
73+
self.assertTrue("KeyError: 'nonexistent_key'" in stderr_watcher.getvalue())
74+
6575
def test_add_static_fields(self):
6676
fr = jsonlogger.JsonFormatter(static_fields={'log_stream': 'kafka'})
6777

@@ -133,7 +143,7 @@ def test_log_adict(self):
133143
self.assertEqual(log_json.get("num"), msg["num"])
134144
self.assertEqual(log_json.get("5"), msg[5])
135145
self.assertEqual(log_json.get("nested"), msg["nested"])
136-
self.assertEqual(log_json["message"], '')
146+
self.assertEqual(log_json["message"], "")
137147

138148
def test_log_extra(self):
139149
fr = jsonlogger.JsonFormatter()
@@ -203,22 +213,35 @@ def process_log_record(self, log_record):
203213
log_json = json.loads(self.buffer.getvalue())
204214
self.assertEqual(log_json.get("custom"), "value")
205215

206-
def test_exc_info(self):
207-
fr = jsonlogger.JsonFormatter()
208-
self.log_handler.setFormatter(fr)
216+
def get_traceback_from_exception_followed_by_log_call(self) -> str:
209217
try:
210218
raise Exception('test')
211219
except Exception:
212220
self.log.exception("hello")
213-
214-
expected_value = traceback.format_exc()
221+
str_traceback = traceback.format_exc()
215222
# Formatter removes trailing new line
216-
if expected_value.endswith('\n'):
217-
expected_value = expected_value[:-1]
223+
if str_traceback.endswith('\n'):
224+
str_traceback = str_traceback[:-1]
225+
226+
return str_traceback
227+
228+
def test_exc_info(self):
229+
fr = jsonlogger.JsonFormatter()
230+
self.log_handler.setFormatter(fr)
231+
expected_value = self.get_traceback_from_exception_followed_by_log_call()
218232

219233
log_json = json.loads(self.buffer.getvalue())
220234
self.assertEqual(log_json.get("exc_info"), expected_value)
221235

236+
def test_exc_info_renamed(self):
237+
fr = jsonlogger.JsonFormatter("%(exc_info)s", rename_fields={"exc_info": "stack_trace"})
238+
self.log_handler.setFormatter(fr)
239+
expected_value = self.get_traceback_from_exception_followed_by_log_call()
240+
241+
log_json = json.loads(self.buffer.getvalue())
242+
self.assertEqual(log_json.get("stack_trace"), expected_value)
243+
self.assertEqual(log_json.get("exc_info"), None)
244+
222245
def test_ensure_ascii_true(self):
223246
fr = jsonlogger.JsonFormatter()
224247
self.log_handler.setFormatter(fr)

0 commit comments

Comments
 (0)