Skip to content

Commit d4cf970

Browse files
fix Graylog parsing issue
1 parent 1b24aea commit d4cf970

File tree

2 files changed

+12
-3
lines changed

2 files changed

+12
-3
lines changed

packages/service-library/src/servicelib/logging_utils.py

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@
6363
class LogExtra(TypedDict):
6464
log_uid: NotRequired[str]
6565
log_oec: NotRequired[str]
66-
log_trace_id: NotRequired[str]
6766

6867

6968
def get_log_record_extra(
@@ -98,7 +97,10 @@ def format(self, record) -> str:
9897
if hasattr(record, "file_name_override"):
9998
record.filename = record.file_name_override
10099

101-
for name in LogExtra.__optional_keys__: # pylint: disable=no-member
100+
optional_keys = LogExtra.__optional_keys__ | frozenset(
101+
["otelTraceID", "otelSpanID"]
102+
) # pylint: disable=no-member
103+
for name in optional_keys:
102104
if not hasattr(record, name):
103105
setattr(record, name, None)
104106

@@ -121,13 +123,14 @@ def format(self, record) -> str:
121123
"log_uid=%(log_uid)s",
122124
"log_oec=%(log_oec)s",
123125
"log_trace_id=%(otelTraceID)s",
126+
"log_span_id=%(otelSpanID)s",
124127
"log_msg=%(message)s",
125128
]
126129
)
127130

128131
_LOCAL_FORMATTING: Final[str] = (
129132
"%(levelname)s: [%(asctime)s/%(processName)s] "
130-
"[log_trace_id=%(otelTraceID)s] "
133+
"[log_trace_id=%(otelTraceID)s|log_span_id=%(otelSpanID)s] "
131134
"[%(name)s:%(funcName)s(%(lineno)d)] - %(message)s"
132135
)
133136

packages/service-library/tests/test_logging_utils.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -614,6 +614,7 @@ def _create_test_log_record(
614614
user_id: int | str | None = None,
615615
error_code: str | None = None,
616616
trace_id: str | None = None,
617+
span_id: str | None = None,
617618
) -> logging.LogRecord:
618619
"""Create a test LogRecord with optional extra fields."""
619620
from servicelib.logging_utils import get_log_record_extra
@@ -637,6 +638,7 @@ def _create_test_log_record(
637638

638639
# Add OpenTelemetry trace ID
639640
record.otelTraceID = trace_id # type: ignore[attr-defined]
641+
record.otelSpanID = span_id # type: ignore[attr-defined]
640642

641643
return record
642644

@@ -670,6 +672,7 @@ def test_grok_pattern_parsing(caplog: pytest.LogCaptureFixture) -> None:
670672
user_id=12345,
671673
error_code="OEC001",
672674
trace_id="1234567890abcdef1234567890abcdef",
675+
span_id="987654321",
673676
)
674677

675678
# Format the record
@@ -691,6 +694,7 @@ def test_grok_pattern_parsing(caplog: pytest.LogCaptureFixture) -> None:
691694
assert groups["log_uid"] == "12345"
692695
assert groups["log_oec"] == "OEC001"
693696
assert groups["log_trace_id"] == "1234567890abcdef1234567890abcdef"
697+
assert groups["log_span_id"] == "987654321"
694698

695699
# Verify the message is correctly escaped (newlines become \\n)
696700
expected_message = test_message.replace("\n", "\\n")
@@ -725,6 +729,7 @@ def test_grok_pattern_parsing_with_none_values(
725729
user_id=None,
726730
error_code=None,
727731
trace_id=None,
732+
span_id=None,
728733
)
729734

730735
formatted_log = formatter.format(record)
@@ -741,4 +746,5 @@ def test_grok_pattern_parsing_with_none_values(
741746
assert groups["log_uid"] == "None"
742747
assert groups["log_oec"] == "None"
743748
assert groups["log_trace_id"] == "None"
749+
assert groups["log_span_id"] == "None"
744750
assert groups["log_msg"] == "Error message"

0 commit comments

Comments
 (0)