在 Flask 应用中,如果你想要在每个 logger.info 调用中自动包含客户端的 IP 地址,你可以通过自定义 logging.Formatter 来实现。这样,你可以在日志消息中注入请求的 IP 地址,而不需要在每个视图函数中手动添加它。

以下是一个示例,展示如何创建一个自定义的 Formatter 类来自动包含 IP 地址:

from flask import has_request_context, request
import logging

class RequestFormatter(logging.Formatter):
    def format(self, record):
        if has_request_context():
            record.url = request.url
            record.remote_addr = request.remote_addr
        else:
            record.url = None
            record.remote_addr = None
        return super().format(record)

# 配置 Flask 的默认日志处理器
default_handler = logging.StreamHandler()
default_handler.setFormatter(RequestFormatter(
    '[%(asctime)s] %(remote_addr)s requested %(url)s\n%(levelname)s in %(module)s: %(message)s'
))

# 获取 Flask 应用的 logger 并添加我们的默认处理器
app.logger.addHandler(default_handler)

在这个示例中,我们定义了一个 RequestFormatter 类,它继承自 logging.Formatter。在这个类的 format 方法中,我们检查是否有请求上下文(即是否在处理请求时调用日志记录)。如果有,我们就添加 urlremote_addr 属性到 record 对象中,这样它们就可以在日志消息中使用。

然后,我们配置 Flask 的默认日志处理器来使用这个格式器,并将其添加到 Flask 应用的 logger 中。这样,每个日志消息都会自动包含请求的 IP 地址和 URL。

请注意,这个方法假设你的应用运行在没有代理的环境中。如果你的应用部署在代理后面(例如,使用 Nginx 或其他反向代理),你可能需要使用 X-Forwarded-ForX-Real-IP 头部来获取客户端的真实 IP 地址。在这种情况下,你需要相应地修改 RequestFormatter 类来从这些头部中获取 IP 地址。