diff --git a/rain_api_core/logging.py b/rain_api_core/logging.py index 419334e..38359fb 100644 --- a/rain_api_core/logging.py +++ b/rain_api_core/logging.py @@ -158,7 +158,7 @@ def format(self, record: logging.LogRecord) -> str: obj = self.formatMessage(record) assert not any(isinstance(val, PercentPlaceholder) for val in _walk_json_values(obj)) - return filter_log_credentials(json.dumps(obj)) + return filter_log_credentials(json.dumps(obj, default=str)) class TaggingFilter(logging.Filter): diff --git a/tests/test_logging.py b/tests/test_logging.py index 5572469..6eff238 100644 --- a/tests/test_logging.py +++ b/tests/test_logging.py @@ -269,6 +269,18 @@ def test_json_logging_quotes_malformed(logger, log_io): assert json.loads(msg) == {"message": obj} +def test_json_logging_not_serializable(logger, log_io): + class SomeClass(): + def __repr__(self) -> str: + return "SomeClass()" + + logger.info(SomeClass()) + + msg = log_io.getvalue() + assert msg == '{"message": "SomeClass()"}\n' + assert json.loads(msg) == {"message": "SomeClass()"} + + def test_json_logging_missing_key(logger, custom_log_handler, log_io): custom_log_handler.setFormatter(JSONFormatter("%(does_not_exist)s")) logger.info("hello")