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

如何在Flask v3中记录任意请求头(如X-Request-ID)?

在Flask v3中记录X-Request-ID/X-Amzn-Trace-Id请求头的方法

Flask v3无需依赖第三方扩展,通过请求钩子和自定义日志过滤器就能轻松实现请求ID的全局记录,以下是两种常用方案:

方案一:全局日志自动携带请求ID

这种方式能让所有日志条目自动附加请求ID,适合全链路追踪场景:

实现步骤

  1. 在请求钩子中提取/生成请求ID:在请求开始时从请求头获取ID,无则生成默认UUID
  2. 自定义日志过滤器:将请求ID注入日志记录的上下文
  3. 配置日志格式:把请求ID加入日志输出模板

代码示例

from flask import Flask, request
import logging
from logging import Filter
import uuid

app = Flask(__name__)

# 初始化请求ID的前置钩子
@app.before_request
def set_request_id():
    # 优先级:X-Request-ID > X-Amzn-Trace-Id > 自动生成UUID
    request_id = request.headers.get('X-Request-ID') or request.headers.get('X-Amzn-Trace-Id')
    request.request_id = request_id if request_id else str(uuid.uuid4())

# 自定义日志过滤器,添加请求ID字段
class RequestIDFilter(Filter):
    def filter(self, record):
        record.request_id = getattr(request, 'request_id', '-')  # 非请求日志用'-'占位
        return True

# 配置日志格式与处理器
log_formatter = logging.Formatter('%(asctime)s - %(levelname)s - [%(request_id)s] - %(message)s')
stream_handler = logging.StreamHandler()
stream_handler.setFormatter(log_formatter)
stream_handler.addFilter(RequestIDFilter())

# 绑定到Flask日志器
app.logger.addHandler(stream_handler)
app.logger.setLevel(logging.INFO)

# 测试路由
@app.route('/')
def index():
    app.logger.info('处理首页请求')
    return f'Request ID: {request.request_id}'

方案二:手动记录请求ID(简单场景)

如果只需要在特定路由或逻辑中记录请求ID,直接提取后写入日志即可:

@app.route('/api/query')
def query_data():
    request_id = request.headers.get('X-Request-ID') or request.headers.get('X-Amzn-Trace-Id') or 'unknown'
    app.logger.info(f'处理查询请求,请求ID: {request_id}')
    return {'status': 'success', 'request_id': request_id}

注意事项

  • 若需要跨线程传递请求ID(比如异步任务),需额外使用flask.copy_current_request_context装饰器或手动传递ID
  • 可以根据业务需求调整请求ID的生成规则,比如使用更短的随机字符串替代UUID

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 17:30:09