Skip to content

Commit f16020c

Browse files
authored
Merge pull request #1 from mozilla/add-mozlog-on-startup
Adding log.py to capture logging setup and configuration.
2 parents 1f82ba9 + a5574a3 commit f16020c

File tree

3 files changed

+54
-35
lines changed

3 files changed

+54
-35
lines changed

src/app/api.py

Lines changed: 8 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import logging
2-
import logging.config
3-
import sys
42
import time
53
from datetime import datetime
64

@@ -9,34 +7,12 @@
97
from fastapi.responses import RedirectResponse
108

119
from src.app.environment import get_settings
10+
from src.app.log import configure_logging
1211
from src.app.monitor import api_router as monitor_router
1312
from src.jbi.router import api_router as jbi_router
1413

1514
settings = get_settings()
1615

17-
logging_config = {
18-
"version": 1,
19-
"formatters": {
20-
"json": {
21-
"()": "dockerflow.logging.JsonLogFormatter",
22-
"logger_name": "jbi",
23-
},
24-
},
25-
"handlers": {
26-
"console": {
27-
"level": settings.log_level.upper(),
28-
"class": "logging.StreamHandler",
29-
"formatter": "json",
30-
"stream": sys.stdout,
31-
}
32-
},
33-
"loggers": {
34-
"request.summary": {"handlers": ["console"], "level": "INFO"},
35-
},
36-
}
37-
38-
logging.config.dictConfig(logging_config)
39-
4016
app = FastAPI(
4117
title="Jira Bugzilla Integration (JBI)",
4218
description="JBI v2 Platform",
@@ -46,8 +22,6 @@
4622
app.include_router(monitor_router)
4723
app.include_router(jbi_router)
4824

49-
summary_logger = logging.getLogger("request.summary")
50-
5125

5226
@app.get("/", include_in_schema=False)
5327
def root(request: Request):
@@ -61,6 +35,7 @@ def root(request: Request):
6135

6236
@app.middleware("http")
6337
async def request_summary(request: Request, call_next):
38+
summary_logger = logging.getLogger("request.summary")
6439
previous_time = time.time()
6540

6641
infos = {
@@ -84,7 +59,12 @@ async def request_summary(request: Request, call_next):
8459
return response
8560

8661

62+
@app.on_event("startup")
63+
def startup_event():
64+
configure_logging()
65+
66+
8767
if __name__ == "__main__":
8868
uvicorn.run(
89-
"app:app", host="0.0.0.0", port=settings.port, reload=settings.app_reload
69+
"app:app", host=settings.host, port=settings.port, reload=settings.app_reload
9070
)

src/app/log.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
import logging
2+
import logging.config
3+
import sys
4+
5+
from src.app.environment import get_settings
6+
7+
settings = get_settings()
8+
9+
10+
def configure_logging():
11+
logging_config = {
12+
"version": 1,
13+
"formatters": {
14+
"mozlog_json": {
15+
"()": "dockerflow.logging.JsonLogFormatter",
16+
"logger_name": "jbi",
17+
},
18+
},
19+
"handlers": {
20+
"console": {
21+
"level": settings.log_level.upper(),
22+
"class": "logging.StreamHandler",
23+
"formatter": "mozlog_json",
24+
"stream": sys.stdout,
25+
}
26+
},
27+
"loggers": {
28+
"request.summary": {"handlers": ["console"], "level": "INFO"},
29+
},
30+
}
31+
32+
logging.config.dictConfig(logging_config)

tests/unit/app/test_api.py

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
from fastapi.testclient import TestClient
2+
3+
from src.app.api import app
4+
5+
16
def test_read_root(anon_client):
27
"""The site root redirects to the Swagger docs"""
38
resp = anon_client.get("/")
@@ -8,12 +13,14 @@ def test_read_root(anon_client):
813
assert prev_resp.headers["location"] == "./docs"
914

1015

11-
def test_request_summary_is_logged(anon_client, caplog):
12-
anon_client.get("/__lbheartbeat__")
16+
def test_request_summary_is_logged(caplog):
17+
with TestClient(app) as anon_client:
18+
# https://fastapi.tiangolo.com/advanced/testing-events/
19+
anon_client.get("/__lbheartbeat__")
1320

14-
summary = caplog.records[-1]
21+
summary = caplog.records[-1]
1522

16-
assert summary.name == "request.summary"
17-
assert summary.method == "GET"
18-
assert summary.path == "/__lbheartbeat__"
19-
assert summary.querystring == {}
23+
assert summary.name == "request.summary"
24+
assert summary.method == "GET"
25+
assert summary.path == "/__lbheartbeat__"
26+
assert summary.querystring == {}

0 commit comments

Comments
 (0)