From 5ed31c4596d61cc93c0441f095877c3c25a7c1b0 Mon Sep 17 00:00:00 2001
From: Rohan Weeden <reweeden@alaska.edu>
Date: Thu, 27 Jan 2022 14:54:38 -0900
Subject: [PATCH] Add JSON encoding default to encode items as strings

---
 rain_api_core/logging.py |  2 +-
 tests/test_logging.py    | 12 ++++++++++++
 2 files changed, 13 insertions(+), 1 deletion(-)

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