如何格式化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钩子手动记录符合自定义格式的请求信息:
实现代码
- 保持logger.py原有配置不变
- 在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
相关产品推荐
相关产品推荐

