如何从 Flask 的日志过滤器中访问 Flask.g 变量?如果不可能,我如何存储/访问请求范围的值?

问题描述 投票:0回答:1

我正在使用 Gunicorn 包装的 Flask 应用程序。只要我删除对自定义过滤器的引用,下面的自定义日志配置似乎就可以工作。但是,一旦我将过滤器添加到配置中,就会收到以下错误:

Error: Working outside of application context.
我也尝试过:

with app.app_context():
    logging.config.dictConfig(logging_cfg)

但这并没有改变什么。这是我的应用程序工厂类:

def create_app(testing=False):
    app = Flask(__name__)

    class CustomApi(flask_restful.Api):
        def handle_error(self, error):
            return global_error_handler(error)

    class DeeIdFilter(logging.Filter):
        def filter(self, record):
            record.some_id = g.get("some_id")
            return True

    logging_cfg = {
        'version': 1,
        'disable_existing_loggers': False,
        'formatters': {
            'KeyValueFormatter': {
                'format': 'loglevel=%(levelname)s id=%(some_id)s msg=%(message)s'
            },
        },
        'handlers': {
            'console': {
                'level': 'INFO',
                'class': 'logging.StreamHandler',
                'formatter': 'KeyValueFormatter',
                'filters': ['IdFilter']
            }
        },
        'loggers': {
            'gunicorn.access': {
                'propagate': True
            },
            'gunicorn.error': {
                'propagate': True
            },
        },
        'root': {
            'level': 'INFO',
            'handlers': ['console']
        },
        'filters': {
            'IdFilter': {
                '()': IdFilter
            }
        }
    }
    
    logging.config.dictConfig(logging_cfg)
    return app
python flask gunicorn flask-restful
1个回答
0
投票

我似乎无法让代码运行或重现错误,因此很难对此进行测试。但是,我的猜测是您需要在过滤器中使用应用程序上下文,如下所示:

    class DeeIdFilter(logging.Filter):
        def filter(self, record):
            with app.app_context():
                record.some_id = g.get("some_id")
                return True
© www.soinside.com 2019 - 2024. All rights reserved.