1
+ import logging
2
+ import sys
3
+ import time
4
+ from datetime import datetime
5
+
1
6
import uvicorn # type: ignore
2
7
from fastapi import FastAPI , Request
3
8
from fastapi .responses import RedirectResponse
6
11
from src .app .monitor import api_router as monitor_router
7
12
from src .jbi .router import api_router as jbi_router
8
13
14
+ settings = get_settings ()
15
+
16
+ logging_config = {
17
+ "version" : 1 ,
18
+ "formatters" : {
19
+ "json" : {
20
+ "()" : "dockerflow.logging.JsonLogFormatter" ,
21
+ "logger_name" : "jbi" ,
22
+ },
23
+ },
24
+ "handlers" : {
25
+ "console" : {
26
+ "level" : settings .log_level .upper (),
27
+ "class" : "logging.StreamHandler" ,
28
+ "formatter" : "json" ,
29
+ "stream" : sys .stdout ,
30
+ }
31
+ },
32
+ "loggers" : {
33
+ "request.summary" : {"handlers" : ["console" ], "level" : "INFO" },
34
+ },
35
+ }
36
+
37
+ logging .config .dictConfig (logging_config )
38
+
9
39
app = FastAPI (
10
40
title = "Jira Bugzilla Integration (JBI)" ,
11
41
description = "JBI v2 Platform" ,
15
45
app .include_router (monitor_router )
16
46
app .include_router (jbi_router )
17
47
48
+ summary_logger = logging .getLogger ("request.summary" )
18
49
19
50
@app .get ("/" , include_in_schema = False )
20
51
def root (request : Request ):
@@ -26,8 +57,32 @@ def root(request: Request):
26
57
return RedirectResponse (url = "./docs" )
27
58
28
59
60
+ @app .middleware ("http" )
61
+ async def request_summary (request : Request , call_next ):
62
+ previous_time = time .time ()
63
+
64
+ infos = {
65
+ "agent" : request .headers .get ("User-Agent" ),
66
+ "path" : request .url .path ,
67
+ "method" : request .method ,
68
+ "lang" : request .headers .get ("Accept-Language" ),
69
+ "querystring" : dict (request .query_params ),
70
+ "errno" : 0 ,
71
+ }
72
+
73
+ response = await call_next (request )
74
+
75
+ current = time .time ()
76
+ duration = int ((current - previous_time ) * 1000.0 )
77
+ isotimestamp = datetime .fromtimestamp (current ).isoformat ()
78
+ infos = {"time" : isotimestamp , "code" : response .status_code , "t" : duration , ** infos }
79
+
80
+ summary_logger .info ("" , extra = infos )
81
+
82
+ return response
83
+
84
+
29
85
if __name__ == "__main__" :
30
- settings = get_settings ()
31
86
uvicorn .run (
32
87
"app:app" , host = "0.0.0.0" , port = settings .port , reload = settings .app_reload
33
88
)
0 commit comments