在 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
方法中,我们检查是否有请求上下文(即是否在处理请求时调用日志记录)。如果有,我们就添加 url
和 remote_addr
属性到 record
对象中,这样它们就可以在日志消息中使用。
然后,我们配置 Flask 的默认日志处理器来使用这个格式器,并将其添加到 Flask 应用的 logger 中。这样,每个日志消息都会自动包含请求的 IP 地址和 URL。
请注意,这个方法假设你的应用运行在没有代理的环境中。如果你的应用部署在代理后面(例如,使用 Nginx 或其他反向代理),你可能需要使用 X-Forwarded-For
或 X-Real-IP
头部来获取客户端的真实 IP 地址。在这种情况下,你需要相应地修改 RequestFormatter
类来从这些头部中获取 IP 地址。