如何在Flask v3中记录任意请求头(如X-Request-ID)?
在Flask v3中记录X-Request-ID/X-Amzn-Trace-Id请求头的方法
Flask v3无需依赖第三方扩展,通过请求钩子和自定义日志过滤器就能轻松实现请求ID的全局记录,以下是两种常用方案:
方案一:全局日志自动携带请求ID
这种方式能让所有日志条目自动附加请求ID,适合全链路追踪场景:
实现步骤
- 在请求钩子中提取/生成请求ID:在请求开始时从请求头获取ID,无则生成默认UUID
- 自定义日志过滤器:将请求ID注入日志记录的上下文
- 配置日志格式:把请求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
相关产品推荐
相关产品推荐

