附加自定义消息以记录烧瓶中的输出

时间:2019-06-18 21:23:09

标签: python-3.x logging flask

我正在尝试将唯一消息附加到给定请求的日志输出中。

我的烧瓶应用程序设置可以使用默认日志记录,但是我想增强输出,以包括针对每个请求附加到日志输出的自定义消息。

我在博客下面引用了该消息,但是自定义消息似乎没有添加。我想这是因为我正在尝试调用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

0 个答案:

没有答案
相关问题