首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用fastapi日志记录捕获X-Forwarded-For?

如何使用fastapi日志记录捕获X-Forwarded-For?
EN

Stack Overflow用户
提问于 2021-02-09 05:25:51
回答 2查看 695关注 0票数 1

我在一个函数中使用guvicorn运行FastApi:

代码语言:javascript
复制
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的样子:

代码语言:javascript
复制
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中放入此选项,以便将客户端IP转发到我的API:

代码语言:javascript
复制
option forwardfor

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

代码语言:javascript
复制
[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正在log客户端的IP,我也无法记录它。

是否有可用于log_config访问部分的自定义变量?

谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-02-28 09:34:54

您可以使用proxy_headers=True填充远程地址信息:

从文档中:

代码语言:javascript
复制
--proxy-headers / --no-proxy-headers
                                  Enable/Disable X-Forwarded-Proto,
                                  X-Forwarded-For, X-Forwarded-Port to
                                  populate remote address info.

https://www.uvicorn.org/deployment/#running-from-the-command-line

票数 3
EN

Stack Overflow用户

发布于 2021-03-01 03:42:26

好吧,我想通了。

我不得不在start.py中包含两件事:

代码语言:javascript
复制
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"
    )
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66109609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档