Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x 如何使用fastapi日志记录捕获X-Forwarded-For?_Python 3.x_Haproxy_Fastapi_Uvicorn - Fatal编程技术网

Python 3.x 如何使用fastapi日志记录捕获X-Forwarded-For?

Python 3.x 如何使用fastapi日志记录捕获X-Forwarded-For?,python-3.x,haproxy,fastapi,uvicorn,Python 3.x,Haproxy,Fastapi,Uvicorn,我正在使用guvicorn运行FastApi,函数如下: if __name__ == "__main__": uvicorn.run( app="app.main:app", host="HOSTIP", port=8000, reload=True, # log_config=None, log_config=log_confi

我正在使用guvicorn运行FastApi,函数如下:

if __name__ == "__main__":

    uvicorn.run(
        app="app.main:app",
        host="HOSTIP",
        port=8000,
        reload=True,
        # log_config=None,
        log_config=log_config,
        log_level="info"
    )
这是我的日志配置的样子:

log_config = {
    "version": 1,
    "disable_existing_loggers": True,
    "formatters": {
        "default": {
            "()": "uvicorn.logging.DefaultFormatter",
            "fmt": "%(asctime)s::%(levelname)s::%(name)s::%(filename)s::%(funcName)s - %(message)s",
            "use_colors": None,
        },
        "access": {
            "()": "uvicorn.logging.AccessFormatter",
            "fmt": '%(asctime)s::%(levelprefix)s %(client_addr)s - "%(request_line)s" %(status_code)s',
        },
    },
    "handlers":
    {
        "default":
        {
            "formatter": "default",
            # "class": 'logging.NullHandler',
            "class": 'logging.FileHandler',
            "filename": CONFIG[SECTION]["default"]
        },
        "error":
        {
            "formatter": "default",
            # "class": 'logging.NullHandler',
            "class": 'logging.FileHandler',
            "filename": CONFIG[SECTION]["error"]
        },
        "access":
        {
            "formatter": "access",
            # "class": 'logging.NullHandler',
            "class": 'logging.FileHandler',
            "filename": CONFIG[SECTION]["access"]
        },
    },
    "loggers":
    {
        "uvicorn": {"handlers": ["default"], "level": "INFO", "propagate": False},
        "uvicorn.error": {"handlers": ["error"], "level": "ERROR", "propagate": False},
        "uvicorn.access": {"handlers": ["access"], "level": "INFO", "propagate": False},
    }
}
我在两台服务器上有两个fastapi实例,运行在haproxy后面。我能够在haproxy to fwd客户端IP中输入此选项到我的API:

option forwardfor
我可以在其中一个API服务器上与TCPDUMP确认,我实际上收到了一些x-fwd头:

[user@server ~]# tcpdump -i INTERFACE host SERVERIP -AAA | grep -i IP OF MY LAPTOP
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on INTERFACE, link-type EN10MB (Ethernet), capture size 262144 bytes
*X-Forwarded-For: IP OF MY LAPTOP*
但在我的日志中,我只看到请求命中的vip的IP,即使HAproxy正在刷新客户端的IP,我也无法记录它

是否有一个自定义变量可用于日志配置访问部分


谢谢。

您可以使用
proxy\u headers=True
填充远程地址信息:

从文件中:

--proxy-headers / --no-proxy-headers
                                  Enable/Disable X-Forwarded-Proto,
                                  X-Forwarded-For, X-Forwarded-Port to
                                  populate remote address info.

好吧,我想出来了

我必须在start.py中包含两件事:

if __name__ == "__main__":

    uvicorn.run(
        app="app.main:app",
        host="HOSTIP",
        port=8000,
        reload=True,
        proxy_headers=True, # THIS LINE
        forwarded_allow_ips='*', # THIS LINE
        log_config=log_config,
        log_level="info"
    )

我在信中加了这个。访问日志似乎仍然显示VIP的ip。是否有其他变量可用于格式化程序?这就是我目前拥有的:31“()”:“uvicorn.logging.AccessFormatter”,33“fmt”:“%(asctime)s::%(levelprefix)s%(客户端地址)s-“%(请求行)s”%(状态代码)s”,是的,在我发送给你的文档中,它解释说如果你的流量不是来自127.0.0.1的话,你还需要使用转发的允许IP地址,感谢我让它工作的方向。