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

标签 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_config,
        log_level="info"
    )

这是我的 log_config 的样子:

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},
    }
}

我在 2 台服务器上有 2 个 fastapi 实例,在 haproxy 后面运行。我能够在 haproxy 中放入此选项以将客户端 IP 转发到我的 API:

option forwardfor

我能够在其中一个 API 服务器上使用 TCPDUMP 确认我实际上收到了一些 x-fwd header :

[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,我也无法记录它。

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

谢谢。

最佳答案

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

来自文档:

--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

关于python-3.x - 如何使用 fastapi 日志记录捕获 X-Forwarded-For?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66109609/

相关文章:

python - python在Mathematica中有类似 "Chop"的功能吗?

python - 使用 FastAPI 进行 Pytest : Assertion Error (Response 422)

python - 如何在 FastAPI 中使用默认参数运行 python 脚本?

ssl - HAProxy 背后的 Gitlab 与 ssl 终止

Python FastAPI "Post Unprocessable Entity"错误

python - Anaconda: cannot import cv2 even though opencv is installed (how to install opencv3 for python3)

python pycharm依赖同步

python - 简洁的Python方法来改变一个值,如果它不是Falsey

haproxy - 我可以使用通配符 SNI 与 HAProxy 匹配吗?

ssl - 解析切换规则时检测到 HAProxy 错误 : no such ACL : '{hdr(host)'