ashb commented on code in PR #60258:
URL: https://github.com/apache/airflow/pull/60258#discussion_r2671829482


##########
shared/logging/src/airflow_shared/logging/percent_formatter.py:
##########
@@ -53,17 +53,22 @@ def __getitem__(self, key):
         # If there is no callsite info (often for stdout/stderr), show the 
same sort of thing that stdlib
         # logging would
         # 
https://github.com/python/cpython/blob/d3c888b4ec15dbd7d6b6ef4f15b558af77c228af/Lib/logging/__init__.py#L1652C34-L1652C48
-        if key == "lineno":
-            return self.event.get("lineno", 0)
-        if key == "filename":
-            return self.event.get("filename", "(unknown file)")
-        if key == "funcName":
-            return self.event.get("funcName", "(unknown function)")
-
         if key in PercentFormatRender.callsite_parameters:
-            return 
self.event.get(PercentFormatRender.callsite_parameters[key].value)
+            val = 
self.event.get(PercentFormatRender.callsite_parameters[key].value)
+            # Return appropriate default based on the parameter type
+            if val is None:
+                if key == "lineno":
+                    return 0
+                if key in ("process", "thread"):
+                    return 0
+                if key == "filename":
+                    return "(unknown file)"
+                if key == "funcName":
+                    return "(unknown function)"
+                return "(unknown)"
+            return val
         if key == "name":
-            return self.event.get("logger") or self.event.get("logger_name")
+            return self.event.get("logger") or self.event.get("logger_name") 
or "(unknown)"

Review Comment:
   ```suggestion
               return self.event.get("logger") or self.event.get("logger_name", 
"(unknown)")
   ```



##########
shared/logging/src/airflow_shared/logging/percent_formatter.py:
##########
@@ -53,17 +53,22 @@ def __getitem__(self, key):
         # If there is no callsite info (often for stdout/stderr), show the 
same sort of thing that stdlib
         # logging would
         # 
https://github.com/python/cpython/blob/d3c888b4ec15dbd7d6b6ef4f15b558af77c228af/Lib/logging/__init__.py#L1652C34-L1652C48
-        if key == "lineno":
-            return self.event.get("lineno", 0)
-        if key == "filename":
-            return self.event.get("filename", "(unknown file)")
-        if key == "funcName":
-            return self.event.get("funcName", "(unknown function)")
-
         if key in PercentFormatRender.callsite_parameters:
-            return 
self.event.get(PercentFormatRender.callsite_parameters[key].value)
+            val = 
self.event.get(PercentFormatRender.callsite_parameters[key].value)
+            # Return appropriate default based on the parameter type
+            if val is None:
+                if key == "lineno":
+                    return 0
+                if key in ("process", "thread"):
+                    return 0
+                if key == "filename":
+                    return "(unknown file)"
+                if key == "funcName":
+                    return "(unknown function)"
+                return "(unknown)"
+            return val

Review Comment:
   Honestly this is now a bit hard to follow:
   
   ```suggestion
           if key in {"lineno", "process" "thread"}:
               return self.event.get(key, 0)
           if key == "filename":
               return self.event.get("filename", "(unknown file)")
           if key == "funcName":
               return self.event.get("funcName", "(unknown function)")
   
           if key in PercentFormatRender.callsite_parameters:
               return 
self.event.get(PercentFormatRender.callsite_parameters[key].value, "(unknown)")
   ```



##########
shared/logging/src/airflow_shared/logging/percent_formatter.py:
##########
@@ -85,7 +90,8 @@ def __getitem__(self, key):
                 return ""
             return self.level_styles.get(self.event.get("level", 
self.method_name), "")
 
-        return self.event[key]
+        val = self.event.get(key)
+        return val if val is not None else ""

Review Comment:
   I'm not so sure about this one -- it would mean that `"%(x)r"` would show 
`""` instead of `None`.



##########
shared/logging/tests/logging/test_percent_formatter.py:
##########
@@ -29,3 +29,21 @@ def test_no_callsite(self):
         formatted = fmter(mock.Mock(name="Logger"), "info", {"event": "our 
msg"})
 
         assert formatted == "(unknown file):0 our msg"
+
+    def test_percent_formatter_handles_none_values(self):
+        """Test that PercentFormatRender handles None values gracefully."""
+        fmter = PercentFormatRender("%(filename)s:%(lineno)d %(message)s")
+
+        # Mock logger and event_dict with None values
+        logger = mock.Mock(name="Logger")
+        event_dict = {
+            "event": "test message",
+            "filename": None,
+            "lineno": None,
+        }

Review Comment:
   Is this accurately representing the event dict that is created, or would it 
be this?
   
   ```py
           event_dict = {
               "event": "test message",
           }
   ```



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to