You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flask 0.12中修改默认日志格式化器?

自定义Flask 0.12的请求日志格式化器

看起来你已经在尝试给Flask 0.12添加包含请求信息的日志格式化器了,我来帮你补全并优化这段代码,确保它能稳定工作。

Flask 0.12的日志系统基于Python标准库的logging模块,默认日志输出不会携带请求相关细节,我们可以通过自定义Formatter来实现这一点。

完整实现代码

from pomegranate.routes import app
from flask import request
from flask.logging import Formatter, StreamHandler
import logging

class RequestFormatter(Formatter):
    def format(self, record):
        # 处理无请求上下文的场景(比如应用启动日志、后台异步任务)
        try:
            record.url = request.url
            record.remote_addr = request.remote_addr
            record.request_id = request.headers.get('X-Request-Id', '')
        except RuntimeError:
            record.url = '-'
            record.remote_addr = '-'
            record.request_id = '-'
        return super().format(record)

# 初始化格式化器,补全完整的日志格式字符串
formatter = RequestFormatter(
    '[%(asctime)s] %(request_id)s %(remote_addr)s %(url)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
)

# 获取或创建StreamHandler(Flask默认的日志处理器)
handler = StreamHandler()
handler.setFormatter(formatter)

# 清空原有处理器避免日志重复输出
app.logger.handlers.clear()
# 添加自定义处理器
app.logger.addHandler(handler)
# 根据需求设置日志级别(DEBUG/INFO等)
app.logger.setLevel(logging.DEBUG)

关键细节说明

  • 请求上下文兼容:加入try-except块,避免在没有请求上下文的场景(比如启动脚本、后台任务)抛出RuntimeError。
  • 完整日志格式:补全了你截断的格式字符串,包含请求ID、客户端IP、请求URL、日志级别、消息以及代码位置等实用信息。
  • 避免重复日志:清空app.logger原有的处理器再添加自定义处理器,解决多处理器导致的日志重复输出问题。

配置完成后,你的Flask应用日志会自动携带每个请求的关键信息,大幅提升问题排查效率。

内容的提问来源于stack exchange,提问作者ACC

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:52:32