From b0a7483f01f7b5c3fd060574de4fb13b6b99fae2 Mon Sep 17 00:00:00 2001 From: Guilherme Ferrari Date: Sun, 8 Jan 2023 10:42:29 -0300 Subject: [PATCH 1/4] test that exc_info rename works --- tests/tests.py | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-) diff --git a/tests/tests.py b/tests/tests.py index 1ca77fb..4b84c94 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -202,22 +202,34 @@ def process_log_record(self, log_record): logJson = json.loads(self.buffer.getvalue()) self.assertEqual(logJson.get("custom"), "value") - def testExcInfo(self): - fr = jsonlogger.JsonFormatter() - self.logHandler.setFormatter(fr) + def get_traceback_from_exception_followed_by_log_call(self) -> str: try: raise Exception('test') except Exception: - self.logger.exception("hello") - - expected_value = traceback.format_exc() + str_traceback = traceback.format_exc() # Formatter removes trailing new line - if expected_value.endswith('\n'): - expected_value = expected_value[:-1] + if str_traceback.endswith('\n'): + str_traceback = str_traceback[:-1] - logJson = json.loads(self.buffer.getvalue()) - self.assertEqual(logJson.get("exc_info"), expected_value) + return str_traceback + + def testExcInfo(self): + fr = jsonlogger.JsonFormatter() + self.logHandler.setFormatter(fr) + expected_value = self.get_traceback_from_exception_followed_by_log_call() + + log_json = json.loads(self.buffer.getvalue()) + self.assertEqual(log_json.get("exc_info"), expected_value) + + def testExcInfoRenamed(self): + fr = jsonlogger.JsonFormatter("%(exc_info)s", rename_fields={"exc_info": "stack_trace"}) + self.logHandler.setFormatter(fr) + expected_value = self.get_traceback_from_exception_followed_by_log_call() + + log_json = json.loads(self.buffer.getvalue()) + self.assertEqual(log_json.get("stack_trace"), expected_value) + self.assertEqual(log_json.get("exc_info"), None) def testEnsureAsciiTrue(self): fr = jsonlogger.JsonFormatter() From 61e07c546dbc27cf798e9142e8dbc5f946b7768c Mon Sep 17 00:00:00 2001 From: Guilherme Ferrari Date: Sun, 8 Jan 2023 10:43:22 -0300 Subject: [PATCH 2/4] test renaming of nonexistent key --- tests/tests.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/tests/tests.py b/tests/tests.py index 4b84c94..961ffbb 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -62,6 +62,16 @@ def testRenameBaseField(self): self.assertEqual(logJson["@message"], msg) + def testRenameNonexistentField(self): + fr = jsonlogger.JsonFormatter(rename_fields={'nonexistent_key': 'new_name'}) + self.logHandler.setFormatter(fr) + + stderr_watcher = StringIO() + sys.stderr = stderr_watcher + self.logger.info("testing logging rename") + + self.assertTrue("KeyError: 'nonexistent_key'" in stderr_watcher.getvalue()) + def testAddStaticFields(self): fr = jsonlogger.JsonFormatter(static_fields={'log_stream': 'kafka'}) From 98c0616799ff3ff9f5b8c01d63e330d57c4f31a5 Mon Sep 17 00:00:00 2001 From: Guilherme Ferrari Date: Sun, 8 Jan 2023 10:43:58 -0300 Subject: [PATCH 3/4] fix renaming of fields --- src/pythonjsonlogger/jsonlogger.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/pythonjsonlogger/jsonlogger.py b/src/pythonjsonlogger/jsonlogger.py index 215c130..5fbe4ad 100644 --- a/src/pythonjsonlogger/jsonlogger.py +++ b/src/pythonjsonlogger/jsonlogger.py @@ -168,10 +168,8 @@ def add_fields(self, log_record: Dict[str, Any], record: logging.LogRecord, mess Override this method to implement custom logic for adding fields. """ for field in self._required_fields: - if field in self.rename_fields: - log_record[self.rename_fields[field]] = record.__dict__.get(field) - else: - log_record[field] = record.__dict__.get(field) + log_record[field] = record.__dict__.get(field) + log_record.update(self.static_fields) log_record.update(message_dict) 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 key = self.timestamp if type(self.timestamp) == str else 'timestamp' log_record[key] = datetime.fromtimestamp(record.created, tz=timezone.utc) + self._perform_rename_log_fields(log_record) + + def _perform_rename_log_fields(self, log_record): + for old_field_name, new_field_name in self.rename_fields.items(): + log_record[new_field_name] = log_record[old_field_name] + del log_record[old_field_name] + def process_log_record(self, log_record): """ Override this method to implement custom logic From fe1d5df0696c4e9ecba269779b8df9be71ad0ffe Mon Sep 17 00:00:00 2001 From: Zakaria Zajac Date: Sun, 12 Feb 2023 09:45:03 -0800 Subject: [PATCH 4/4] Merged in test reformatting from master --- tests/tests.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/tests/tests.py b/tests/tests.py index ff301a1..f0010f4 100644 --- a/tests/tests.py +++ b/tests/tests.py @@ -62,17 +62,17 @@ def test_rename_base_field(self): self.assertEqual(log_json["@message"], msg) - def testRenameNonexistentField(self): + def test_rename_nonexistent_field(self): fr = jsonlogger.JsonFormatter(rename_fields={'nonexistent_key': 'new_name'}) - self.logHandler.setFormatter(fr) + self.log_handler.setFormatter(fr) stderr_watcher = StringIO() sys.stderr = stderr_watcher - self.logger.info("testing logging rename") + self.log.info("testing logging rename") self.assertTrue("KeyError: 'nonexistent_key'" in stderr_watcher.getvalue()) - def testAddStaticFields(self): + def test_add_static_fields(self): fr = jsonlogger.JsonFormatter(static_fields={'log_stream': 'kafka'}) self.log_handler.setFormatter(fr) @@ -213,7 +213,6 @@ def process_log_record(self, log_record): log_json = json.loads(self.buffer.getvalue()) self.assertEqual(log_json.get("custom"), "value") - def get_traceback_from_exception_followed_by_log_call(self) -> str: try: raise Exception('test')