Я пытаюсь добавить уникальное сообщение в журнал вывода для данного запроса.
У меня есть настройка приложения фляги, которая работает с ведением журнала по умолчанию, но я хотел улучшить вывод, добавив специальное сообщение, добавляемое к выводу журнала для каждого запроса.
Я ссылался ниже на блог, но пользовательское сообщение, похоже, не добавляется. Я думаю, это потому, что я пытаюсь вызвать конечную точку отдыха, и к тому времени приложение фляги уже загружено?
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
1017 * Ouput *
DEBUG - None - Starting test()
DEBUG - None - Completed test
если я передам ABCD вызову rest, я ожидаю, что он будет добавлен ко всем сообщениям журнала для данного запроса. Я не уверен, как передать уникальное значение в фильтр журнала. Вышеприведенная логика в методе log_util.request_id не завершена.
Есть идеи, пожалуйста?
Ожидаемый результат
DEBUG - None - ABCD - Starting test()
DEBUG - None - ABCD - Completed test