推荐大家一个对日志文件进行二分查找的工具

2016-04-05 15:46:10 +08:00
 fanfank
例如我要从 NGINX 日志或者其它业务日志中搜索一个关键字 xxx ,如果你知道这个关键字所在的大致时间区间,例如今天上午的 10 点到今天上午的 11 点 11 分,那么你可以这么搜:
timecat -s "2016-04-05 10:00:00" -e "2016-04-05 11:11:00" access.log | grep "xxx"

-s 和-e 分别是时间区间的起始时间和终止时间,只要是通用的时间日期格式都能识别,例如"2016/Apr/05 10:00:00",或者直接一个时间戳"1459821600"等都可以。

为什么要做这么一个工具呢?配合线上运维工具能够很快地进行日志的关键字搜索,大大降低线上机器消耗的磁盘 IO 以及 CPU ,尤其是对动辄几个 G 的日志文件,定位速度都极其快。

日志搜索的方案很多,统一收集后跑任务去计算,或者用流式处理等都是可选方案。但是这个工具最大的优势在于即拿即用,没有额外的机器资源以及相关的其它运维需求。
对于创业公司早期(其实甚至到中期后期都是很好的选择之一),或者自己做项目有日志定位及搜索需求的,这个工具都十分给力。

唯一要求就是你的环境中装了 Python 2.7+(暂不支持 Python 3 )
地址: https://github.com/fanfank/timecat
4661 次点击
所在节点    DevOps
11 条回复
iambic
2016-04-05 17:52:03 +08:00
大部分的服务应该都能做到对日志按小时切割吧,比如 nginx 这种。
suduo1987
2016-04-05 18:14:20 +08:00
为什么不用正则表达式?
upupxjg
2016-04-05 19:07:12 +08:00
sed 不就行了么
vus520
2016-04-05 19:22:40 +08:00
for i in $( seq 1 10); do sed ${i}0000p xxx.log ; done

楼主说得太多了
fanfank
2016-04-05 20:13:40 +08:00
@iambic 对,按日志切分也会非常大,日志文件也可能非常大,尤其是最前面做 Load balance 的机器。实时搜索速度是很重要的,尤其你可能需要使用 logid 去关联整个调用链,数十个日志文件,即便切分过,每个都全量去 grep 耗时会比较长
fanfank
2016-04-05 20:15:30 +08:00
@vus520 grep 、 awk 、 timecat 的 benchmark 参见这个地址中的第 4 部分,我就是怕发太多了没人看所以没有在这里贴 benchmark : http://blog.reetsee.com/archives/502
fanfank
2016-04-05 20:17:19 +08:00
@suduo1987 对日志文件中的每一行都用正则去判断(例如用 grep )是非常耗资源的, benchamark 参见: http://blog.reetsee.com/archives/502
hustlike
2016-04-05 20:17:24 +08:00
为什么不用 splunk ……
fanfank
2016-04-05 20:36:47 +08:00
@hustlike 我在这个帖子的追加内容中补充了一下, splunk 我不太了解,是不是和 ELK 等工具差不多的日志解决方案?如果是的话那起码它需要额外的机器资源,或者需要在线上服务的机器中部署收集日志的 agent 或在业务代码 /框架中发送消息到日志收集器,体量上相对大一点
Mutoo
2016-04-05 21:03:26 +08:00
之前对一个 500G 的基于时间排序的文本文件处理(千万行)也是自己写了一个二分查找,平均定位次数只要 log(10000000)/log(2) = 23 次就能定位到数据。效率是非常好的。
jedihy
2016-04-06 03:41:25 +08:00
@suduo1987 正则搜大文本搜好几年。

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

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

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

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

© 2021 V2EX