Skip to content

Commit 9eda892

Browse files
committed
Removing fastapi imports from standard import tree
(cherry picked from commit 4c96cb8)
1 parent 9a4c312 commit 9eda892

File tree

3 files changed

+128
-129
lines changed

3 files changed

+128
-129
lines changed

json_logging/__init__.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -400,10 +400,11 @@ def init_connexion(custom_formatter=None, enable_json=False):
400400
# register FastAPI support
401401
import json_logging.framework.fastapi as fastapi_support
402402

403-
register_framework_support('fastapi', app_configurator=None,
404-
app_request_instrumentation_configurator=fastapi_support.FastAPIAppRequestInstrumentationConfigurator,
405-
request_adapter_class=fastapi_support.FastAPIRequestAdapter,
406-
response_adapter_class=fastapi_support.FastAPIResponseAdapter)
403+
if fastapi_support.is_fastapi_present():
404+
register_framework_support('fastapi', app_configurator=None,
405+
app_request_instrumentation_configurator=fastapi_support.FastAPIAppRequestInstrumentationConfigurator,
406+
request_adapter_class=fastapi_support.FastAPIRequestAdapter,
407+
response_adapter_class=fastapi_support.FastAPIResponseAdapter)
407408

408409
def init_fastapi(custom_formatter=None, enable_json=False):
409410
__init(framework_name='fastapi', custom_formatter=custom_formatter, enable_json=enable_json)
Lines changed: 1 addition & 125 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,3 @@
1-
# coding=utf-8
2-
import logging
3-
4-
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
5-
from starlette.requests import Request
6-
from starlette.responses import Response
7-
from starlette.types import ASGIApp
8-
9-
import json_logging
10-
import json_logging.framework
11-
from json_logging.framework_base import AppRequestInstrumentationConfigurator, RequestAdapter, ResponseAdapter
12-
13-
from json_logging.util import is_not_match_any_pattern
14-
151

162
def is_fastapi_present():
173
# noinspection PyPep8,PyBroadException
@@ -24,114 +10,4 @@ def is_fastapi_present():
2410

2511

2612
if is_fastapi_present():
27-
import fastapi
28-
import starlette.requests
29-
import starlette.responses
30-
31-
32-
class JSONLoggingASGIMiddleware(BaseHTTPMiddleware):
33-
def __init__(self, app: ASGIApp, exclude_url_patterns=tuple()) -> None:
34-
super().__init__(app)
35-
self.request_logger = logging.getLogger('fastapi-request-logger')
36-
self.exclude_url_patterns = exclude_url_patterns
37-
logging.getLogger("uvicorn.access").propagate = False
38-
39-
async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
40-
log_request = is_not_match_any_pattern(request.url.path, self.exclude_url_patterns)
41-
42-
if not log_request:
43-
return await call_next(request)
44-
45-
request_info = json_logging.RequestInfo(request)
46-
response = await call_next(request)
47-
request_info.update_response_status(response)
48-
self.request_logger.info(
49-
"", extra={"request_info": request_info, "type": "request"}
50-
)
51-
return response
52-
53-
54-
class FastAPIAppRequestInstrumentationConfigurator(AppRequestInstrumentationConfigurator):
55-
def config(self, app, exclude_url_patterns=tuple()):
56-
if not is_fastapi_present():
57-
raise RuntimeError("fastapi is not available in system runtime")
58-
if not isinstance(app, fastapi.FastAPI):
59-
raise RuntimeError("app is not a valid fastapi.FastAPI instance")
60-
61-
# Disable standard logging
62-
logging.getLogger('uvicorn.access').disabled = True
63-
64-
# noinspection PyAttributeOutsideInit
65-
self.request_logger = logging.getLogger('fastapi-request-logger')
66-
67-
app.add_middleware(JSONLoggingASGIMiddleware, exclude_url_patterns=exclude_url_patterns)
68-
69-
70-
class FastAPIRequestAdapter(RequestAdapter):
71-
@staticmethod
72-
def get_request_class_type():
73-
return starlette.requests.Request
74-
75-
@staticmethod
76-
def support_global_request_object():
77-
return False
78-
79-
@staticmethod
80-
def get_current_request():
81-
raise NotImplementedError
82-
83-
def get_remote_user(self, request: starlette.requests.Request):
84-
try:
85-
return request.user
86-
except AssertionError:
87-
return json_logging.EMPTY_VALUE
88-
89-
def get_http_header(self, request: starlette.requests.Request, header_name, default=None):
90-
try:
91-
if header_name in request.headers:
92-
return request.headers.get(header_name)
93-
except:
94-
pass
95-
return default
96-
97-
def set_correlation_id(self, request_, value):
98-
request_.state.correlation_id = value
99-
100-
def get_correlation_id_in_request_context(self, request: starlette.requests.Request):
101-
try:
102-
return request.state.correlation_id
103-
except AttributeError:
104-
return None
105-
106-
def get_protocol(self, request: starlette.requests.Request):
107-
protocol = str(request.scope.get('type', ''))
108-
http_version = str(request.scope.get('http_version', ''))
109-
if protocol.lower() == 'http' and http_version:
110-
return protocol.upper() + "/" + http_version
111-
return json_logging.EMPTY_VALUE
112-
113-
def get_path(self, request: starlette.requests.Request):
114-
return request.url.path
115-
116-
def get_content_length(self, request: starlette.requests.Request):
117-
return request.headers.get('content-length', json_logging.EMPTY_VALUE)
118-
119-
def get_method(self, request: starlette.requests.Request):
120-
return request.method
121-
122-
def get_remote_ip(self, request: starlette.requests.Request):
123-
return request.client.host
124-
125-
def get_remote_port(self, request: starlette.requests.Request):
126-
return request.client.port
127-
128-
129-
class FastAPIResponseAdapter(ResponseAdapter):
130-
def get_status_code(self, response: starlette.responses.Response):
131-
return response.status_code
132-
133-
def get_response_size(self, response: starlette.responses.Response):
134-
return response.headers.get('content-length', json_logging.EMPTY_VALUE)
135-
136-
def get_content_type(self, response: starlette.responses.Response):
137-
return response.headers.get('content-type', json_logging.EMPTY_VALUE)
13+
from .implementation import FastAPIAppRequestInstrumentationConfigurator, FastAPIRequestAdapter, FastAPIResponseAdapter
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import logging
2+
3+
import json_logging
4+
import json_logging.framework
5+
from json_logging.framework_base import AppRequestInstrumentationConfigurator, RequestAdapter, ResponseAdapter
6+
7+
from json_logging.util import is_not_match_any_pattern
8+
9+
import fastapi
10+
import starlette.requests
11+
import starlette.responses
12+
13+
from starlette.middleware.base import BaseHTTPMiddleware, RequestResponseEndpoint
14+
from starlette.requests import Request
15+
from starlette.responses import Response
16+
from starlette.types import ASGIApp
17+
18+
19+
class JSONLoggingASGIMiddleware(BaseHTTPMiddleware):
20+
def __init__(self, app: ASGIApp, exclude_url_patterns=tuple()) -> None:
21+
super().__init__(app)
22+
self.request_logger = logging.getLogger('fastapi-request-logger')
23+
self.exclude_url_patterns = exclude_url_patterns
24+
logging.getLogger("uvicorn.access").propagate = False
25+
26+
async def dispatch(self, request: Request, call_next: RequestResponseEndpoint) -> Response:
27+
log_request = is_not_match_any_pattern(request.url.path, self.exclude_url_patterns)
28+
29+
if not log_request:
30+
return await call_next(request)
31+
32+
request_info = json_logging.RequestInfo(request)
33+
response = await call_next(request)
34+
request_info.update_response_status(response)
35+
self.request_logger.info(
36+
"", extra={"request_info": request_info, "type": "request"}
37+
)
38+
return response
39+
40+
41+
class FastAPIAppRequestInstrumentationConfigurator(AppRequestInstrumentationConfigurator):
42+
def config(self, app, exclude_url_patterns=tuple()):
43+
if not isinstance(app, fastapi.FastAPI):
44+
raise RuntimeError("app is not a valid fastapi.FastAPI instance")
45+
46+
# Disable standard logging
47+
logging.getLogger('uvicorn.access').disabled = True
48+
49+
# noinspection PyAttributeOutsideInit
50+
self.request_logger = logging.getLogger('fastapi-request-logger')
51+
52+
app.add_middleware(JSONLoggingASGIMiddleware, exclude_url_patterns=exclude_url_patterns)
53+
54+
55+
class FastAPIRequestAdapter(RequestAdapter):
56+
@staticmethod
57+
def get_request_class_type():
58+
return starlette.requests.Request
59+
60+
@staticmethod
61+
def support_global_request_object():
62+
return False
63+
64+
@staticmethod
65+
def get_current_request():
66+
raise NotImplementedError
67+
68+
def get_remote_user(self, request: starlette.requests.Request):
69+
try:
70+
return request.user
71+
except AssertionError:
72+
return json_logging.EMPTY_VALUE
73+
74+
def get_http_header(self, request: starlette.requests.Request, header_name, default=None):
75+
try:
76+
if header_name in request.headers:
77+
return request.headers.get(header_name)
78+
except:
79+
pass
80+
return default
81+
82+
def set_correlation_id(self, request_, value):
83+
request_.state.correlation_id = value
84+
85+
def get_correlation_id_in_request_context(self, request: starlette.requests.Request):
86+
try:
87+
return request.state.correlation_id
88+
except AttributeError:
89+
return None
90+
91+
def get_protocol(self, request: starlette.requests.Request):
92+
protocol = str(request.scope.get('type', ''))
93+
http_version = str(request.scope.get('http_version', ''))
94+
if protocol.lower() == 'http' and http_version:
95+
return protocol.upper() + "/" + http_version
96+
return json_logging.EMPTY_VALUE
97+
98+
def get_path(self, request: starlette.requests.Request):
99+
return request.url.path
100+
101+
def get_content_length(self, request: starlette.requests.Request):
102+
return request.headers.get('content-length', json_logging.EMPTY_VALUE)
103+
104+
def get_method(self, request: starlette.requests.Request):
105+
return request.method
106+
107+
def get_remote_ip(self, request: starlette.requests.Request):
108+
return request.client.host
109+
110+
def get_remote_port(self, request: starlette.requests.Request):
111+
return request.client.port
112+
113+
114+
class FastAPIResponseAdapter(ResponseAdapter):
115+
def get_status_code(self, response: starlette.responses.Response):
116+
return response.status_code
117+
118+
def get_response_size(self, response: starlette.responses.Response):
119+
return response.headers.get('content-length', json_logging.EMPTY_VALUE)
120+
121+
def get_content_type(self, response: starlette.responses.Response):
122+
return response.headers.get('content-type', json_logging.EMPTY_VALUE)

0 commit comments

Comments
 (0)