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

如何格式化Flask Werkzeug日志或将请求信息整合到自定义日志格式?

Flask日志优化:处理Werkzeug冗余日志的两种方案

当前配置与问题

现有logger.py配置:

logfile = f"{ basedir }/app.log"
log_format = '%(asctime)s - %(levelname)s - (%(threadName)-10s) - %(message)s'
logging.basicConfig(filename = logfile, format = log_format, level=logging.DEBUG)
log = logging.getLogger()

各业务文件通过from logger import log调用日志。当前问题:Web请求触发的日志中,Werkzeug自动追加的内容包含冗余时间,仅需保留IP和请求核心信息。


方案a:格式化Werkzeug输出,移除冗余信息

直接修改Werkzeug专属日志器的格式,替换默认输出模板,保留所需字段并支持扩展:

实现代码

在logger.py或Flask应用初始化文件中添加以下逻辑:

import logging

# 原有日志配置(保留)
logfile = f"{basedir}/app.log"
log_format = '%(asctime)s - %(levelname)s - (%(threadName)-10s) - %(message)s'
logging.basicConfig(filename=logfile, format=log_format, level=logging.DEBUG)
log = logging.getLogger()

# 配置Werkzeug日志
werkzeug_logger = logging.getLogger('werkzeug')
# 清除原有handler,避免重复输出
for handler in werkzeug_logger.handlers[:]:
    werkzeug_logger.removeHandler(handler)
# 添加自定义handler与格式
handler = logging.FileHandler(logfile)
# 自定义格式:保留IP、请求方法、路径、协议、状态码,移除冗余时间
custom_werkzeug_format = '%(asctime)s - %(levelname)s - (%(threadName)-10s) - %(remote_addr)s - "%(method)s %(path)s HTTP/%(http_version)s" %(status)s'
handler.setFormatter(logging.Formatter(custom_werkzeug_format))
werkzeug_logger.addHandler(handler)
werkzeug_logger.setLevel(logging.INFO)

说明

  • 通过logging.getLogger('werkzeug')定位到Werkzeug的日志器,替换其输出格式
  • 可按需扩展格式字段,比如结合请求上下文注入%(user_id)s等业务信息
  • 保持与自定义日志格式的一致性,避免日志风格混乱

方案b:禁用Werkzeug日志,自定义请求日志

完全屏蔽Werkzeug的自动请求日志,通过Flask钩子手动记录符合自定义格式的请求信息:

实现代码

  1. 保持logger.py原有配置不变
  2. 在Flask应用主文件中添加钩子逻辑:
from flask import Flask, request
from logger import log
import logging

app = Flask(__name__)

# 禁用Werkzeug的请求日志(仅保留严重错误日志)
logging.getLogger('werkzeug').setLevel(logging.CRITICAL)

# 用after_request钩子记录请求信息
@app.after_request
def log_request_details(response):
    # 构造自定义日志消息
    request_info = (
        f"{request.remote_addr} - "
        f"\"{request.method} {request.path} HTTP/{request.environ.get('SERVER_PROTOCOL')}\" "
        f"{response.status_code}"
    )
    log.info(request_info)
    return response

说明

  • 通过将Werkzeug日志级别设为CRITICAL,彻底关闭其自动请求日志输出
  • 利用after_request钩子,在请求处理完成后获取请求与响应信息,按自定义格式记录
  • 可灵活扩展日志内容,比如加入请求参数、用户身份标识、响应耗时等业务相关信息

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 18:44:52