我正在使用 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
我似乎无法让代码运行或重现错误,因此很难对此进行测试。但是,我的猜测是您需要在过滤器中使用应用程序上下文,如下所示:
class DeeIdFilter(logging.Filter):
def filter(self, record):
with app.app_context():
record.some_id = g.get("some_id")
return True