Добавить пользовательское сообщение для вывода журнала в колбу - PullRequest
0 голосов
/ 19 июня 2019

Я пытаюсь добавить уникальное сообщение в журнал вывода для данного запроса.

У меня есть настройка приложения фляги, которая работает с ведением журнала по умолчанию, но я хотел улучшить вывод, добавив специальное сообщение, добавляемое к выводу журнала для каждого запроса.

Я ссылался ниже на блог, но пользовательское сообщение, похоже, не добавляется. Я думаю, это потому, что я пытаюсь вызвать конечную точку отдыха, и к тому времени приложение фляги уже загружено?

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
...