Python 如何从flask';s global';g';访问日志中的对象?

Python 如何从flask';s global';g';访问日志中的对象?,python,logging,flask,gunicorn,Python,Logging,Flask,Gunicorn,我正在使用gunicorn运行我的烧瓶应用程序 我在Flask的全局g对象上有一个user\u id,我想在每个经过身份验证的请求上登录该对象 有人知道这样做的好方法吗?我尝试添加这样的自定义筛选器,但在执行记录器时,请求似乎不在范围内: class MyFilter(logging.Filter): def filter(self, record): if hasattr(g, 'user_id'): record.msg = "User I

我正在使用gunicorn运行我的烧瓶应用程序

我在Flask的全局
g
对象上有一个
user\u id
,我想在每个经过身份验证的请求上登录该对象

有人知道这样做的好方法吗?我尝试添加这样的自定义筛选器,但在执行记录器时,请求似乎不在范围内:


class MyFilter(logging.Filter):

    def filter(self, record):
        if hasattr(g, 'user_id'):
            record.msg = "User ID: {0} ".format(g.user_id) + record.msg
        return 1

我期待着这样的事情:

2014-11-08 21:52:15 [INFO] REQUESTLOG 127.0.0.1 User ID: 12345 "GET /v1.0/healthcheck HTTP/1.1" 200 51 "-" "curl/7.35.0" 2014-11-08 21:52:15[信息]REQUESTLOG 127.0.0.1用户ID:12345“GET/v1.0/healthcheck HTTP/1.1”200 51“-”curl/7.35.0
谢谢

您可以对Werkzeug请求处理程序进行子类化,并提供自己版本的
log\u request()
方法。以下是一个例子:

from werkzeug.serving import BaseRequestHandler
from flask import Flask
app = Flask(__name__)

@app.route('/')
def index():
    return "hi"

class MyRequestHandler(BaseRequestHandler):
    def log_request(self, code='-', size='-'):
        self.log('info', 'custom log! "%s" %s %s', self.requestline, code, size)

if __name__ == '__main__':
    app.run(debug=True, request_handler=MyRequestHandler)

很酷,谢谢@Miguel。但是,如果我正在运行
gunicorn
,如何指定请求处理程序?@greegles:我很困惑。如果您运行的是gunicorn,那么您就没有运行Werkzeug,因此此代码永远不会运行。您得到的日志必须是gunicorn的,而不是Werkzeug的。是的,很抱歉造成混淆。日志来自gunicorn,但我仍在寻找从flask
g
对象添加自定义属性的方法。有什么建议吗?我不知道。将特定于烧瓶的东西放入gunicorn日志听起来要困难得多,gunicorn对烧瓶或其应用程序/请求上下文一无所知。我建议您使用这些信息编写自己的日志。