借助二分法匹配时间戳实现快速查找日志内容
前言
借助二分法能够快速匹配时间戳,根据时间戳来找出需要查找的日志内容。
查找前提条件:
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()
借助二分法匹配时间戳实现快速查找日志内容相关推荐
- 如何快速查看日志内容
一.cat 选项与参数: -A :相当于-vET的整合,可列出一些特殊字符而不是空白而已: -b :列出行号,仅针对非空白行做出行号显示,空白行不标行号: -E :将结尾的换行符$显示出来: -n : ...
- python二分法查找时间点_python有序查找算法:二分法
二分法是一种快速查找的方法,时间复杂度低,逻辑简单易懂,总的来说就是不断的除以2除以2... 但是需要注意:待查找的序列区间单调有序 例如需要查找有序数组arr里面的某个关键字key的位置,那么首先确 ...
- sublime快捷键:快速查找函数和快速匹配括号
1. 快速查找函数 Ctrl+R 2. 快速匹配括号 光标置于括号中,Ctrl+Shift+M 快速匹配括号内容,再按下 Ctrl+Shift+[ 折叠代码, Ctrl+Shift+] 展开代码. 3 ...
- 快速搭建日志系统——ELK STACK
什么是ELK STACK ELK Stack是Elasticserach.Logstash.Kibana三种工具组合而成的一个日志解决方案.ELK可以将我们的系统日志.访问日志.运行日志.错误日志等进 ...
- 快速了解日志概貌,详细解读13种日志模式解析算法
云智慧 AIOps 社区是由云智慧发起,针对运维业务场景,提供算法.算力.数据集整体的服务体系及智能运维业务场景的解决方案交流社区.该社区致力于传播 AIOps 技术,旨在与各行业客户.用户.研究者和 ...
- List中根据对象字段快速查找对象
import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; import java.util. ...
- 基于Linux系统的快速查找方法
1 引言 Linux,全称GNU/Linux,是一种免费使用和自由传播的类UNIX操作系统.由于其多用.多任务特性,被广泛应用于服务器开发和嵌入式开发.在系统运行过程中,会产生了大量的信息,不管是日志 ...
- java快速查找算法_Java实现的快速查找算法示例
本文实例讲述了Java实现的快速查找算法.分享给大家供大家参考,具体如下: 快速查找算法,可以根据想要找的是第几个大的数,每次循环都能固定下来一个数在数组完整排完序之后的位置,每次循环都能定一个数的位 ...
- linux查找日志技巧
对于从事web开发的人员来说.服务器上的日志多如牛毛,如何快速从中找出所需信息非常重要,以下是我在工作中用到的查找日志的简单命令,希望能对您有所帮助: 工具/原料 linux SecureCRT 方法 ...
最新文章
- 如何成为软件工程师的团队合作者
- 塔式、机架式、刀片式服务器比较
- python【数据结构与算法】最小生成树之Kruskal算法
- Acwing第 27 场周赛【完结】
- 化工原理(过滤和沉淀)
- [转] Gmail 的Host解决方案
- 从Paxos到ZooKeeper-四、ZooKeeper技术内幕
- Php保护数据库连接信息,php连接数据库,哪里填自己的数据库信息啊,能⭕下吗?我乱填后总是服务器正在维护。代码如下...
- java设计模式学习3--Command Pattern[原创]
- CSDNamp;amp;《程序员》杂志创始人——蒋涛 推荐
- 台电 8G U盘通过量产程序实现USB-CDROM启动
- 飞飞键盘鼠标连点器v1.0绿色版
- 杭电oj基础题目(1106、1108、1163、1164、1170、1194、1197)
- spring mvc
- 测试工程师如何跟进用户反馈
- 怎么用计算机隐藏应用程序,win7 隐藏应用程序 电脑如何隐藏程序_win7教程_uc电脑园...
- 2022年推土机司机(建筑特殊工种)考试题库及推土机司机(建筑特殊工种)考试技巧
- Python(1)概述与基础
- opencv图片旋转90°/-90°/180°
- JAVA基础——基本类型
热门文章
- MyEclipse连接oracle9i:invalid or unknown NLS parameter value specified错误
- C++ string类中的find()函数的简单使用
- 一个关于linux文件预读机制问题
- GenericFactoryMethod泛型工厂模式实现简单IOC功能
- wgrib读grib数据
- linux 操作系统chgrp 的命令用法
- 解决linux ssh客户端SSH连接linux服务器很慢的问题
- (转) oc static extern 和const
- 记一次小的51CTO聚会
- 中国人必须知道的76个常识。。。看了才发现,自己知道的实在太少了。。。学习。。。。...