Skip to content

Commit 3839c1b

Browse files
committed
Add and document a logging filter
1 parent 3919aa8 commit 3839c1b

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

docs/fastapi.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -293,10 +293,16 @@ for at least the ``request.summary`` logger:
293293
'logger_name': 'myproject'
294294
}
295295
},
296+
'filters': {
297+
'request_id': {
298+
'()': 'dockerflow.fastapi.RequestIdFilter',
299+
},
300+
},
296301
'handlers': {
297302
'console': {
298303
'level': 'DEBUG',
299304
'class': 'logging.StreamHandler',
305+
'filters': ['request_id'],
300306
'formatter': 'json'
301307
},
302308
},

src/dockerflow/fastapi/__init__.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from logging import Filter, LogRecord
2+
3+
from asgi_correlation_id import correlation_id
14
from fastapi import APIRouter
25
from fastapi.routing import APIRoute
36

@@ -12,3 +15,14 @@
1215
],
1316
)
1417
"""This router adds the Dockerflow views."""
18+
19+
20+
class RequestIdLogFilter(Filter):
21+
"""Logging filter to attach request IDs to log records"""
22+
23+
def filter(self, record: "LogRecord") -> bool:
24+
"""
25+
Attach the request ID to the log record.
26+
"""
27+
record.rid = correlation_id.get(None)
28+
return True

tests/fastapi/test_fastapi.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from fastapi.testclient import TestClient
1010

1111
from dockerflow import checks
12+
from dockerflow.fastapi import RequestIdLogFilter
1213
from dockerflow.fastapi import router as dockerflow_router
1314
from dockerflow.fastapi.middleware import (
1415
CorrelationIdMiddleware,
@@ -77,6 +78,40 @@ def test_mozlog_request_id(client, caplog):
7778
assert record.rid == "tracked-value"
7879

7980

81+
def test_mozlog_without_correlation_id_middleware(client, caplog):
82+
app = FastAPI()
83+
app.include_router(dockerflow_router)
84+
app.add_middleware(MozlogRequestSummaryLogger)
85+
client = TestClient(app)
86+
87+
client.get("/__lbheartbeat__")
88+
record = caplog.records[0]
89+
90+
assert record.rid is None
91+
92+
93+
def test_request_id_passed_to_all_log_messages(caplog):
94+
handler = logging.StreamHandler()
95+
handler.addFilter(RequestIdLogFilter())
96+
_logger = logging.getLogger("some_logger")
97+
_logger.addHandler(handler)
98+
99+
app = create_app()
100+
101+
@app.get("/ping")
102+
def ping():
103+
logger = logging.getLogger("some_logger")
104+
logger.info("returning pong")
105+
return "pong"
106+
107+
client = TestClient(app)
108+
109+
client.get("/ping")
110+
111+
log_message = next(r for r in caplog.records if r.name == "some_logger")
112+
assert log_message.rid is not None
113+
114+
80115
def test_mozlog_failure(client, mocker, caplog):
81116
mocker.patch(
82117
"dockerflow.fastapi.views.get_version", side_effect=ValueError("crash")

0 commit comments

Comments
 (0)