借助二分法匹配时间戳实现快速查找日志内容

前言

  借助二分法能够快速匹配时间戳,根据时间戳来找出需要查找的日志内容。

  查找前提条件:

    1 因为是二分法特性,所以日志的时间必须是按从小到大或者从大到小的顺序排列。

    2 根据查找需要,修改匹配时间戳。

    3 根据不同的时间戳格式,修改对应的代码。

  1 import os
  2 import time
  3 import sys
  4
  5 class SearchLog(object):
  6
  7     def __init__(self, file_name=‘./log.txt‘):      
  8         self.fp = open(file_name)             
  9         self.fp.seek(0, os.SEEK_END)      #把指针移动到结尾
 10         self.size = self.fp.tell()       #tell()方法能够告诉我们文件的大小
 11         self.fp.seek(0, os.SEEK_SET)      #吧指针移动到文件内容的开头
 12
 13     def Search_cmp(self, timestamp, line):      #定义一个匹配时间戳的方法
 14         tmp = line.split(‘ ‘)          
 15         riqi=tmp[0]
 16         shijian=tmp[1]
 17         realtime=riqi+‘ ‘+shijian                  #在这里可以修改要匹配的时间戳格式
 18         #print realtime
 19         return cmp(timestamp, realtime)          #cmp函数用于比较二者是否相同,如果返回为-1,那么就说明timestamp>realtime,如果等于0,那么两者相等。
 20
 21
 22     def Search_LineHead(self):              #定义一个匹配每行开头的方法
 23
 24         while self.fp.tell() > 0:             
 25             self.fp.seek(-1, os.SEEK_CUR)        #把文件内容的指针在当前位置往前挪一位
 26             val = self.fp.read(1)             # 读取该指针位置的内容
 27             if val == ‘\n‘:                 #匹配该指针内容的值是否等于换行符,等于就跳出循环
 28                 break  
 29             self.fp.seek(-1, os.SEEK_CUR)        #不等于就就继续往前挪一位查找
 30
 31     def Search_TimeStamp(self, timestamp, start_p = 0):
 32
 33         fp_start = start_p
 34         fp_end = self.size
 35
 36         while fp_start < fp_end:              #判断指针开始位置是否小于结束位置
 37             mid = fp_start + (fp_end-fp_start)/2     #找出中间值(利用二分法)
 38             self.fp.seek(mid, os.SEEK_SET)        #通过seek定位到中间值
 39             self.Search_LineHead()            
 40             line = self.fp.readline()
 41             val = self.Search_cmp(timestamp, line)      #调用该方法能够匹配时间戳,返回值为0那么就说明找到了时间戳
 42             if val == 0:          
 43                 print "find timestamp:%s" % line
 44                 return True
 45             elif val == 1:
 46                 fp_start = self.fp.tell()          #如果等于1,说明当前内容的时间戳比输入的时间戳大
 47             else:
 48                 fp_end = mid                  #如果等于其他的,说明当前内容的时间戳比输入的时间戳小,
 49         return False
 50
 51     def Search_FirstStamp(self, timestamp, start_p = 0):
 52
 53         first_point = -1
 54         val = self.Search_TimeStamp(timestamp, start_p)
 55
 56         if val == True:
 57             point = self.fp.tell()                #这里的逻辑是这样的==>
 58             while point > 0:                    #如果search_timestamp这个方法匹配到了时间戳,并且指针恒大于0的话,指针就在当前位置往前挪,直到匹配到换行符,再把这行通过readlie()方法整行独取出来。
 59                 self.fp.seek(-1, os.SEEK_CUR)          #此时再去匹配每行的开头是否等于时间戳,如果等于的话,那么就把指针从文件内容开头移动到匹配到时间戳的这行,标记这行为要查找的时间戳出现的第一行。
 60                 self.Search_LineHead()                  
 61                 point = self.fp.tell()                      
 62                 line = self.fp.readline()
 63                 print line
 64                 if line.startswith(timestamp) == True:
 65                     self.fp.seek(point, os.SEEK_SET)
 66                     continue
 67                 first_point = self.fp.tell()
 68                 break
 69
 70         return first_point
 71
 72     def Search_EndStamp(self, timestamp, start_p = 0):
 73
 74         last_point = -1
 75         val = self.Search_TimeStamp(timestamp, start_p)
 76         if val == True:                        #道理同上,不过这个的就反转过来,用来查找要查找的时间戳的最后一行。
 77             last_point = self.fp.tell()
 78             while last_point < self.size:
 79                 line = self.fp.readline()
 80                 if line.startswith(timestamp) == True:
 81                     last_point = self.fp.tell()
 82                     continue
 83                 print line
 84                 self.fp.seek(last_point, os.SEEK_SET)
 85                 break
 86
 87             return last_point
 88
 89     def Search_Dump(self, s_p, e_p):                  #把查找到的内容写入日志
 90         self.fp.seek(s_p, os.SEEK_SET)
 91         f_log=open(‘search_err.log‘,‘wb‘)
 92         while self.fp.tell() < e_p:
 93             print self.fp.readline()
 94             f_log.write(self.fp.readline())
 95         f_log.close()
 96
 97     def Search_DeInit(self):
 98         self.fp.close()
 99
100 if __name__ == ‘__main__‘:
101     time_s = time.time()
102     obj = SearchLog(sys.argv[3])
103     s_point = obj.Search_FirstStamp(sys.argv[1])
104     if s_point > -1:
105         e_point = obj.Search_EndStamp(sys.argv[2], s_point)
106     if s_point > -1:
107         print s_point , e_point
108         obj.Search_Dump(s_point, e_point)
109     else:
110         print "not find"
111     print time_s, time.time()
112
113     obj.Search_DeInit()
时间: 2024-10-06 15:54:31

借助二分法匹配时间戳实现快速查找日志内容的相关文章

用Beyond Compare精确查找文本内容的方法

Beyond Compare 4中文版拥有强大的文件夹以及文本比较功能,用户在比较文件的时候特别是比较文本的时候,有时需要找出一些特定的内容,这个时候就可以用到Beyond Compare软件精确查找文本内容的功能,但是一些用户不知道怎么使用这项功能,下面就来给大家分享一下用Beyond Compare精确查找文本内容的方法? 打开Beyond Compare软件,选择文本比较会话,打开会话操作界面.单击“打开文件”按钮,选择需要比较的文本文件.  Beyond Compare文本比较会话操作界

shell在大文件日志中按照时间段快速搜索日志

问题描述: 在大流量线上服务中,日志系统会产生数量庞大的日志,动辄就是几十G.在如此之大的文件中快速搜索日志是运维人员经常遇见的问题.我们经常遇见的问题是查询一段时间内的某些条日志.比如,今天有一个访问失败了,大约是在上午9点,把这条日志找出来,然后查找失败原因. 常见处理方式及缺点: 1.如果文件比较小,100m以内使用grep.awk或者sed进行逐条匹配比较方便,但是文件非常大时,其查找效率是非常低的,运行时间长达几十分钟甚至上小时. 2.使用hadoop大数据处理,查询速度快,效率高.但

使用logstash+elasticsearch+kibana快速搭建日志平台

日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日志详情 监控系统的运行状况 统计分析,比如接口的调用次数.执行时间.成功率等 异常数据自动触发消息通知 基于日志的数据挖掘 很多团队在日志方面可能遇到的一些问题有: 开发人员不能登录线上服务器查看详细日志,经过运维周转费时费力 日志数据分散在多个系统,难以查找 日志数据量大,查询速度慢 一个调用会涉及多个系统,难以在这些系统的日志中快速定位数据 数据不够实时 常见的一些重量级的开源

【转载】使用logstash+elasticsearch+kibana快速搭建日志平台

原文链接:http://www.cnblogs.com/buzzlight/p/logstash_elasticsearch_kibana_log.html 日志的分析和监控在系统开发中占非常重要的地位,系统越复杂,日志的分析和监控就越重要,常见的需求有: 根据关键字查询日志详情 监控系统的运行状况 统计分析,比如接口的调用次数.执行时间.成功率等 异常数据自动触发消息通知 基于日志的数据挖掘 很多团队在日志方面可能遇到的一些问题有: 开发人员不能登录线上服务器查看详细日志,经过运维周转费时费力

C++编程 – 快速查找一个对象

2014-7-6 flyfish 在初始阶段会有大量数据增删改,而后期很少有更改,后期大部分是查询操作. 建立索引,使用排序的vector,使用二分法查找 以用户信息为例 用户信息包括,ID,名字,性别,手机号码 class CGender { public: enum { Female=0, Male=1, NotSpecified=2 }; }; class CUser { public: UINT64 m_nID; CString m_strName; int m_nGender; UIN

最佳数据库无限分级快速查找所有子节点的方法

场景我们基本设计的表是这样的 temp表 id, name, parent_id 当我们查某个节点的所有子节点的时候,我们需要递归查询 id = 4 select * from temp where parent_id = 4 ids = [5,9,25] select * from temp where parent_id in [5,9,25] 那么这种方法在层数达到一定层的时候势必带来性能问题,因为需要多次查询数据库,就算写存储过程,性能也是十分低下的. 快速查询方法如下: 改造表,添加c

如何在PDF文件中快速查找关键字,这个方法后悔没早点知道

很多时候当我们在阅读和浏览PDF文档的时候,有时候内容比较多,很难一下就看到自己需要查找的内容,如果是用眼睛慢慢看的话不仅浪费时间浪费精力,还会产生视觉疲劳,想要快速找到关键字就需要用查找功能,那么如何在PDF文件中快速查找关键字?这个方法后悔没早点知道,下面就一起来看看吧.软件介绍:想要快速查找关键词就需要一款能够对PDF文件进行编辑和修改的软件,一款比较专业的PDF编辑器,良心推荐迅捷PDF软件,这款软件不仅能够PDF文件进行修改和编辑,还有很多其他的功能,如PDF添加书签,PDF添加背景等

自定义快速查找字母控件

效果图如下: 首先看看布局文件,自定义的控件中包含一个 ListView,用于显示具体的数据内容: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"     android:layout_width="fill_parent"     a

linux 查找指定内容并显示指定行数的命令,显示匹配行和行号

grep -i "desktop-printing-0.19-20.2.el5.x86_64" -n -A 10 install.log linux 查找指定内容并显示指定行数的命令,显示匹配行和行号,布布扣,bubuko.com