From 3130064f26bc49c756bb79107489841dbce1f33d Mon Sep 17 00:00:00 2001 From: Ramachandra Nalam Date: Sat, 28 Feb 2026 23:21:30 -0800 Subject: [PATCH] Fix structlog JSON serialization crash on non-serializable objects Wrap the enc_hook in json_dumps() with a safe_default() fallback that catches TypeError and falls back to str(). This prevents the logging pipeline from crashing when log event dicts contain objects that msgspec cannot serialize. Closes: #62472 Closes: #62201 Co-Authored-By: Claude Opus 4.6 --- .../logging/src/airflow_shared/logging/structlog.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/shared/logging/src/airflow_shared/logging/structlog.py b/shared/logging/src/airflow_shared/logging/structlog.py index a4fe4ec384c5c..9b617f40c82aa 100644 --- a/shared/logging/src/airflow_shared/logging/structlog.py +++ b/shared/logging/src/airflow_shared/logging/structlog.py @@ -316,7 +316,17 @@ def json_dumps(msg, default): "event": msg.pop("event"), **msg, } - return msgspec.json.encode(msg, enc_hook=default) + + def safe_default(obj): + """Fall back to str() if the default enc_hook fails or is None.""" + if default is not None: + try: + return default(obj) + except TypeError: + pass + return str(obj) + + return msgspec.json.encode(msg, enc_hook=safe_default) json = structlog.processors.JSONRenderer(serializer=json_dumps)