如何在Flask的日志过滤器中访问flask.g变量?如果不行,如何存储/访问请求作用域的值?

0 投票
1 回答
17 浏览
提问于 2025-04-14 18:05

我正在开发一个Flask应用程序,这个应用程序是用Gunicorn来运行的。下面我自定义的日志配置在不使用我自定义的过滤器时似乎可以正常工作。但是一旦我把过滤器加到配置里,就会出现这个错误: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

1 个回答

0

我好像无法让代码运行或者重现错误,所以很难进行测试。不过,我的猜测是你需要在过滤器中使用应用程序的上下文,像这样:

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

撰写回答