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")