forked from bobbui/json-logging-python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path__init__.py
127 lines (94 loc) · 3.65 KB
/
__init__.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# coding=utf-8
import logging
import json_logging
import json_logging.framework
from json_logging.framework_base import AppRequestInstrumentationConfigurator, RequestAdapter, ResponseAdapter
from json_logging.util import is_not_match_any_pattern
def is_flask_present():
# noinspection PyPep8,PyBroadException
try:
import flask
return True
except:
return False
if is_flask_present():
from flask import request as request_obj
import flask as flask
_current_request = request_obj
_flask = flask
class FlaskAppRequestInstrumentationConfigurator(AppRequestInstrumentationConfigurator):
def config(self, app, exclude_url_patterns=[]):
if not is_flask_present():
raise RuntimeError("flask is not available in system runtime")
from flask.app import Flask
if not isinstance(app, Flask):
raise RuntimeError("app is not a valid flask.app.Flask app instance")
# Disable standard logging
logging.getLogger('werkzeug').disabled = True
json_logging.util.update_formatter_for_loggers([logging.getLogger('werkzeug')],
json_logging.JSONLogWebFormatter)
# noinspection PyAttributeOutsideInit
self.request_logger = logging.getLogger('flask-request-logger')
from flask import g
@app.before_request
def before_request():
if is_not_match_any_pattern(_current_request.path, exclude_url_patterns):
g.request_info = json_logging.RequestInfo(_current_request)
@app.after_request
def after_request(response):
if hasattr(g, 'request_info'):
request_info = g.request_info
request_info.update_response_status(response)
self.request_logger.info("", extra={'request_info': request_info})
return response
class FlaskRequestAdapter(RequestAdapter):
@staticmethod
def get_request_class_type():
raise NotImplementedError
@staticmethod
def support_global_request_object():
return True
@staticmethod
def get_current_request():
return _current_request
def get_remote_user(self, request):
if request.authorization is not None:
return request.authorization.username
else:
return json_logging.EMPTY_VALUE
def get_http_header(self, request, header_name, default=None):
try:
if header_name in request.headers:
return request.headers.get(header_name)
except:
pass
return default
def set_correlation_id(self, request_, value):
try:
_flask.g.correlation_id = value
except:
pass
def get_correlation_id_in_request_context(self, request):
try:
return _flask.g.get('correlation_id', None)
except:
return None
def get_protocol(self, request):
return request.environ.get('SERVER_PROTOCOL')
def get_path(self, request):
return request.path
def get_content_length(self, request):
return request.content_length
def get_method(self, request):
return request.method
def get_remote_ip(self, request):
return request.remote_addr
def get_remote_port(self, request):
return request.environ.get('REMOTE_PORT')
class FlaskResponseAdapter(ResponseAdapter):
def get_status_code(self, response):
return response.status_code
def get_response_size(self, response):
return response.calculate_content_length()
def get_content_type(self, response):
return response.content_type