如何对日志文件进行二分查找?开源文件二分查找工具『timecat』介绍

这篇文章是我从自己的博客搬运过来的

转载请注明:吹水小镇 | reetsee.com
原文链接地址: http://blog.reetsee.com/archives/502


要获得更好的阅读体验,欢迎大家到这篇文章的原地址 http://blog.reetsee.com/archives/502 进行阅读

今天我要分享一个用于对日志文件进行二分查找的工具:timecat

项目地址是https://github.com/fanfank/timecat

这个项目的作者是:reetsee.xu,即吹水。

安装方式很简单,只要你装了Python 2,那么可以直接在命令行执行如下pip命令:

pip install timecat

或者直接下载源码中的timecat,执行即可。


0 背景

在开始之前,先进行提问:

假设给你一个日志文件 A.log ,它的大小达到了28G

日志的起始时间为 Jan 1 00:00:00 ,日志的结束时间为 Jan  1 23:59:59

现在要求你从中找出 1月1号20点13分14秒 1月1号20点14分13秒 的所有日志并输出

你会怎么做?

目前头条的线上环境中,大部分日志切分是按照一天一次的方式进行。也就是说,在每台机器上2016年1月2号的日志全部打到一个文件,2016年1月3号的日志全部打到一个文件,目前我看到最大的一个单一日志文件,大小就是28G

继续上面的例子,现在我们要在线上的所有机器上,搜 20点13分14秒 20点14分13秒 之间的这个日志中的某个关键字,并且把包含这个关键字的日志都输出。如果偷点懒,你可以直接使用grep命令去搜这个文件,但这样给定的时间范围这个条件就没用上了,因为grep会从0点开始搜。这样实际在做无用功,时间久不说,还会浪费大量的磁盘I/O。

并且,我们最终是要搜索线上的(部分或所有)机器,应该尽可能减少执行操作时对机器的影响。

所以,我们有几个基本的思路:

  1. 碰到非搜索时间段内的日志时,直接跳过;
  2. 尽量减少对日志文件内容的逻辑判断,过多的判断会造成时间和CPU的浪费。

 

1 思路

还是以上面的例子继续思考。

其实可以这样,我们用awk命令去获取每一行的日期时间:

  1. 当发现日期时间小于1月1号20点13分14秒,就直接跳过不处理;
  2. 当发现日期时间在这个区间 [ 1月1号20点13分14秒, 1月1号20点14分13秒 ),那么就用正则或者用grep去匹配一下有没有对应关键字,有就直接输出;
  3. 当发现日期时间大于等于1月1号20点14分13秒,就直接退出程序。

看起来没啥问题,能省的好像都省了不少。不过还是不够,因为所有时间小于20点13分14秒的行,实际是没有必要读取的,同时在目标时间段内所有日志行,都进行了读取时间日期的操作。

如果日志文件本身是有序的,这些实际是可以省的,我只需要知道起始时间和结束时间在文件中的位置即可,然后读取这两个位置之间的内容并匹配关键字就行。

要直接对有序的内容进行元素定位,最好的方式之一就是使用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值