我正在尝试将唯一消息附加到给定请求的日志输出中。
我的烧瓶应用程序设置可以使用默认日志记录,但是我想增强输出,以包括针对每个请求附加到日志输出的自定义消息。
我在博客下面引用了该消息,但是自定义消息似乎没有添加。我想这是因为我正在尝试调用rest终结点,并且那时烧瓶应用程序已经加载?
http://blog.mcpolemic.com/2016/01/18/adding-request-ids-to-flask.html
log_config.py
import logging.config
LOG_CONFIG = {
'version': 1,
'filters': {
'request_id': {
'()': 'log_util.RequestIdFilter',
},
},
'formatters': {
'standard': {
'format': '%(asctime)s - %(name)s.%(module)s.%(funcName)s:%(lineno)d - %(levelname)s - %(request_id)s - %(message)s',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'filters': ['request_id'],
'formatter': 'standard'
}
},
'loggers': {
'': {
'handlers': ['console'],
'level':'DEBUG',
},
'app': {
'handlers': ['console'],
'level':'DEBUG',
},
}
}
logging.config.dictConfig(LOG_CONFIG)
log_util.py
import logging
import flask
# Generate a new request ID, optionally including an original request ID
def generate_request_id(customMsg):
return customMsg
# Returns the current request ID or a new one if there is none
# In order of preference:
# * If we've already created a request ID and stored it in the flask.g context local, use that
# * If a client has passed in the X-Request-Id header, create a new ID with that prepended
# * Otherwise, generate a request ID and store it in flask.g.request_id
def request_id():
if getattr(flask.g, 'request_id', None):
return flask.g.request_id
headers = flask.request.headers
original_request_id = headers.get("X-Request-Id")
new_uuid = generate_request_id(original_request_id)
flask.g.request_id = new_uuid
return new_uuid
class RequestIdFilter(logging.Filter):
# This is a logging filter that makes the request ID available for use in
# the logging format. Note that we're checking if we're in a request
# context, as we may want to log things before Flask is fully loaded.
def filter(self, record):
record.request_id = request_id() if flask.has_request_context() else ''
return True
烧瓶
import logging
import log_config
import log_util
logger = logging.getLogger(__name__)
@app.route('/test', methods = ['POST'])
def test():
logger.debug('Starting test()')
req = request.get_data()
#process req to dict
reqDict = req.....
log_util.generate_request_id(reqDict['externalId'])
logger.debug('Completed test')
return 'Hello', 200
输出
DEBUG - None - Starting test()
DEBUG - None - Completed test
如果我将ABCD传递给其余的调用,则希望将其应用于给定请求的所有日志消息。我不确定如何将唯一值传递到日志过滤器。 log_util.request_id方法中的上述逻辑不完整。
有什么想法吗?
预期产量
DEBUG - None - ABCD - Starting test()
DEBUG - None - ABCD - Completed test