+29
-2
@@ -7,6 +7,7 @@ from collections.abc import Iterable
|
||||
from typing import Any, TextIO
|
||||
|
||||
import structlog
|
||||
from opentelemetry import trace
|
||||
|
||||
|
||||
_UVICORN_LOGGER_NAMES = ("uvicorn", "uvicorn.error", "uvicorn.access")
|
||||
@@ -19,7 +20,11 @@ def configure_logging(
|
||||
) -> None:
|
||||
resolved_stream = sys.stdout if stream is None else stream
|
||||
formatter = structlog.stdlib.ProcessorFormatter(
|
||||
foreign_pre_chain=list(_shared_processors()),
|
||||
foreign_pre_chain=[
|
||||
_add_trace_context,
|
||||
_render_context_in_event,
|
||||
*_shared_processors(),
|
||||
],
|
||||
processors=[
|
||||
structlog.stdlib.ProcessorFormatter.remove_processors_meta,
|
||||
structlog.processors.JSONRenderer(sort_keys=True, ensure_ascii=False),
|
||||
@@ -33,6 +38,7 @@ def configure_logging(
|
||||
structlog.configure(
|
||||
processors=[
|
||||
structlog.stdlib.PositionalArgumentsFormatter(),
|
||||
_add_trace_context,
|
||||
_render_context_in_event,
|
||||
*_shared_processors(),
|
||||
structlog.processors.StackInfoRenderer(),
|
||||
@@ -62,6 +68,20 @@ def _shared_processors() -> tuple[structlog.types.Processor, ...]:
|
||||
)
|
||||
|
||||
|
||||
def _add_trace_context(
|
||||
_logger: Any,
|
||||
_method_name: str,
|
||||
event_dict: structlog.types.EventDict,
|
||||
) -> structlog.types.EventDict:
|
||||
span_context = trace.get_current_span().get_span_context()
|
||||
if not span_context.is_valid:
|
||||
return event_dict
|
||||
|
||||
event_dict["trace_id"] = format(span_context.trace_id, "032x")
|
||||
event_dict["span_id"] = format(span_context.span_id, "016x")
|
||||
return event_dict
|
||||
|
||||
|
||||
def _render_context_in_event(
|
||||
_logger: Any,
|
||||
_method_name: str,
|
||||
@@ -71,7 +91,14 @@ def _render_context_in_event(
|
||||
context = " ".join(
|
||||
f"{key}={_serialize_log_value(value)}"
|
||||
for key, value in sorted(event_dict.items())
|
||||
if key not in {"event", "exc_info", "stack_info"}
|
||||
if key
|
||||
not in {
|
||||
"event",
|
||||
"exc_info",
|
||||
"stack_info",
|
||||
"_record",
|
||||
"_from_structlog",
|
||||
}
|
||||
)
|
||||
event_dict["event"] = f"{event} {context}" if context else event
|
||||
return event_dict
|
||||
|
||||
Reference in New Issue
Block a user