- 论坛徽章:
- 24
|
本帖最后由 chengchow 于 2017-10-20 11:26 编辑
这个用tail去做,awk/sed/grep都是将文件全文读取到内存再处理,处理大文件效率非常低下,给你个我这边处理日志的脚本,自己去看
思路是,想通过tail从后往前,每次读取1000行,直到满足自己要求为止,目前监控最后2分钟日志,最多的一个项目每次读取大约50000多行,全文不低于2000W行,3G+,JAVA日志
最后对已经读取的日志做处理,目前用于生产,处理每天几个G日志关键词过滤,基本上抓取下2-3秒,全文抓取20秒以上
- #!/usr/bin/env python
- #coding:utf-8
- """
- log_path: 日志相对路径,取gluster[*]之后路径
- key_value: 日志中出现的关键词
- point_of_time: 日志时间点,单位(minutes)
- how_many_times: 关键词出现次数
- """
- import os
- import sys
- import time
- #import re
- ## 规范参数数量
- if len(sys.argv) != 5 :
- print "\nUsage: " + __file__ + " %log_path% %key_value% %point_of_time% %how_many_times%"
- print __doc__
- sys.exit()
- ## 定义参数
- LogHome=['/data/logs/gluster1','/data/logs/gluster2','/data/logs/gluster3'] ## 集群路径,列表模式
- ThorldCount=0 ## 关键词出现次数初始值
- RowCount=1000 ## 每次过滤日志行数
- RowNum=200 ## 总过滤次数
- LogList=[] ## 设置一个空列表给日志路径
- ## 读取带入参数
- LogFile=sys.argv[1]
- KeyWord=sys.argv[2]
- DiffMin=sys.argv[3]
- KeyWordCountThorld=sys.argv[4]
- ## 连接日志路径
- for i in LogHome :
- if os.path.isfile(i + '/' + LogFile) :
- LogList.append(i + '/' + LogFile)
- if len(LogList)==0 :
- print "NULL"
- sys.exit(2)
- ## 轮询处理日志列表
- for log in LogList :
- NowTimeStamp=int(time.time())
- OldTimeStamp=int(time.time())-int(DiffMin)*60
- NowTime=time.strftime('%Y-%m-%d %H:%M',time.localtime(NowTimeStamp))
- OldTime=time.strftime('%Y-%m-%d %H:%M',time.localtime(OldTimeStamp))
- ## 以RowCount为单位找出需求时间内最短日志
- for num in range(1,RowNum+1) :
- HeadTime=os.popen('tail -' + str(RowCount*num) + ' ' + log + ' | awk -F, \'NR==1{print $1}\'').read().strip('\r\n')
- try:
- HeadTimeStamp=int(time.mktime(time.strptime(str(HeadTime),'%Y-%m-%d %H:%M:%S')))
- except:
- continue
- if HeadTimeStamp <= OldTimeStamp :
- break
- elif num==RowNum :
- break
- ## 找出需求时间内最早日志时间
- for i in range(1,int(DiffMin)+1) :
- ReCode=os.system('tail -' + str(RowCount*num) + ' ' + log + ' | grep -P \'' + OldTime + '\' > /dev/null 2>&1')
- if ReCode<>0 :
- OldTimeStamp+=i*60
- OldTime=time.strftime('%Y-%m-%d %H:%M',time.localtime(OldTimeStamp))
- else :
- OldTimeStamp=OldTimeStamp
- OldTime=time.strftime('%Y-%m-%d %H:%M',time.localtime(OldTimeStamp))
- break
- ## 获取日志中关键词出现次数并自加到ThorldCount
- ThorldCount+=int(os.popen('tail -' + str(RowCount*num) + ' ' + log + ' | sed -n "/^' + OldTime + '/,/^' + NowTime + '/p" | grep "' + KeyWord + '" | wc -l').read().strip('\r\n'))
-
- ## 规范输出
- if ThorldCount<=int(KeyWordCountThorld) :
- print 'OK --- 关键词: ' + KeyWord + '; 触发: ' + str(ThorldCount) + " (次); 读取日志: " + str(RowCount) + '*' + str(num) + ' (行); 开始时间: ' + str(OldTime) + '; 结束时间: ' + str(NowTime)
- sys.exit(0)
- else :
- print 'WARNING --- 关键词: ' + KeyWord + '; 触发: ' + str(ThorldCount) + " (次); 读取日志: " + str(RowCount) + '*' + str(num) + ' (行); 开始时间: ' + str(OldTime) + '; 结束时间: ' + str(NowTime)
- sys.exit(2)
复制代码 |
|