- 論壇徽章:
- 24
|
本帖最后由 chengchow 于 2017-10-20 11:26 編輯
這個(gè)用tail去做,awk/sed/grep都是將文件全文讀取到內(nèi)存再處理,處理大文件效率非常低下,給你個(gè)我這邊處理日志的腳本,自己去看
思路是,想通過tail從后往前,每次讀取1000行,直到滿足自己要求為止,目前監(jiān)控最后2分鐘日志,最多的一個(gè)項(xiàng)目每次讀取大約50000多行,全文不低于2000W行,3G+,JAVA日志
最后對(duì)已經(jīng)讀取的日志做處理,目前用于生產(chǎn),處理每天幾個(gè)G日志關(guān)鍵詞過濾,基本上抓取下2-3秒,全文抓取20秒以上
- #!/usr/bin/env python
- #coding:utf-8
- """
- log_path: 日志相對(duì)路徑,取gluster[*]之后路徑
- key_value: 日志中出現(xiàn)的關(guān)鍵詞
- point_of_time: 日志時(shí)間點(diǎn),單位(minutes)
- how_many_times: 關(guān)鍵詞出現(xiàn)次數(shù)
- """
- import os
- import sys
- import time
- #import re
- ## 規(guī)范參數(shù)數(shù)量
- if len(sys.argv) != 5 :
- print "\nUsage: " + __file__ + " %log_path% %key_value% %point_of_time% %how_many_times%"
- print __doc__
- sys.exit()
- ## 定義參數(shù)
- LogHome=['/data/logs/gluster1','/data/logs/gluster2','/data/logs/gluster3'] ## 集群路徑,列表模式
- ThorldCount=0 ## 關(guān)鍵詞出現(xiàn)次數(shù)初始值
- RowCount=1000 ## 每次過濾日志行數(shù)
- RowNum=200 ## 總過濾次數(shù)
- LogList=[] ## 設(shè)置一個(gè)空列表給日志路徑
- ## 讀取帶入?yún)?shù)
- 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為單位找出需求時(shí)間內(nèi)最短日志
- 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
- ## 找出需求時(shí)間內(nèi)最早日志時(shí)間
- 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
- ## 獲取日志中關(guān)鍵詞出現(xiàn)次數(shù)并自加到ThorldCount
- ThorldCount+=int(os.popen('tail -' + str(RowCount*num) + ' ' + log + ' | sed -n "/^' + OldTime + '/,/^' + NowTime + '/p" | grep "' + KeyWord + '" | wc -l').read().strip('\r\n'))
-
- ## 規(guī)范輸出
- if ThorldCount<=int(KeyWordCountThorld) :
- print 'OK --- 關(guān)鍵詞: ' + KeyWord + '; 觸發(fā): ' + str(ThorldCount) + " (次); 讀取日志: " + str(RowCount) + '*' + str(num) + ' (行); 開始時(shí)間: ' + str(OldTime) + '; 結(jié)束時(shí)間: ' + str(NowTime)
- sys.exit(0)
- else :
- print 'WARNING --- 關(guān)鍵詞: ' + KeyWord + '; 觸發(fā): ' + str(ThorldCount) + " (次); 讀取日志: " + str(RowCount) + '*' + str(num) + ' (行); 開始時(shí)間: ' + str(OldTime) + '; 結(jié)束時(shí)間: ' + str(NowTime)
- sys.exit(2)
復(fù)制代碼 |
|