如何得到 flask 中单个请求的唯一 ID?

2017-10-11 19:40:10 +08:00
 workwonder
在一个 flask 应用里面,我输出了各种日志,以结构化形式存到 ElasticSearch,我想把每个日志都归属到具体的请求,以做到可以按请求追溯。应该怎么得到(或生成)一个请求的唯一 ID 呢?

也就是说,用户请求一个地址,其处理过程中生成的一系列日志,和他下一次发起同样的请求所生成的日志,会归属到不同的请求 ID 上。
5805 次点击
所在节点    Python
13 条回复
keysona
2017-10-11 19:44:01 +08:00
我是直接 md5 当前的时间戳,取前面 16 位的。
187j3x1
2017-10-11 19:49:55 +08:00
uuid 啊,标准库
everhythm
2017-10-11 19:53:50 +08:00
workwonder
2017-10-11 19:56:52 +08:00
@187j3x1 UUID 还得找时机生成并挂到 request 对象上,这个最早时机是什么时候?

其实我想知道的是 flask 内部不同的 request 上下文是否有什么标识可以区分,比如 `id(request)` 或 `id(request.some_attr)` 是否可以。
187j3x1
2017-10-11 19:59:59 +08:00
@before_request 钩子放到 g
g.uuid
大概思路
odirus
2017-10-11 20:01:31 +08:00
分享一个其他方法,如果前面有 nginx 的话,

nginx v1.11 支持 $request_id 变量;通过 proxy_set_header X-Request-Id $request_id 的方式把请求唯一 ID 写到 header 中

在 flask 中通过获取头信息的方式即可
workwonder
2017-10-11 20:04:26 +08:00
@odirus 多谢,通过 Nginx 是不错的方法,这样能和 Nginx 日志整合到一起来追溯。
wellsc
2017-10-11 20:19:34 +08:00
@keysona hash 成 md5 要消耗时间性能的
keysona
2017-10-11 20:36:56 +08:00
@wellsc

当初因为 uuid 太长了,就索性简单点自己生成了。
iyaozhen
2017-10-11 21:40:59 +08:00
@workwonder 目前最佳实践是通过 nginx 生成,带到后端的同时返回给前端,方便问题定位。其实 request_id 还可以带上语义,比如说当前时间、机器 ip 等
workwonder
2017-10-11 21:43:04 +08:00
@iyaozhen nice
jyf
2017-10-12 15:46:40 +08:00
你可以考虑用 xid 方案 比 uuid 短 可排序 带时间戳段位 机器应该能支持几百台规模 再多就不行了 当然你可以自己做个扩容实现
workwonder
2017-10-13 13:23:21 +08:00
https://gist.github.com/wonderbeyond/ae7c27be9536d65966f5d94464df0d96

实际需求很简单,我实现的也很简单。
可为什么以 "flask request id" 为关键词找到的别的实现看起来有点复杂而且有点绕,或者完全不是一个意思:

- https://pypi.python.org/pypi/flask-request-id-middleware/1.0
- https://pypi.python.org/pypi/flask-request-id/0.1
- https://github.com/Workable/flask-log-request-id

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/396883

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX