- 增量统计日志行数(只统计上一秒)
dns_qps.py
#!/usr/bin/env python
#_*_coding:utf-8_*_
import datetime
import re
import os
log_files = './dns_logs' #填写要分析的源日志
seek_files = './seek_log.tmp' #生成的临时文件,只用于保存位置seek信息,建议放/tmp/下
last_second = datetime.datetime.now() - datetime.timedelta(seconds=1) #取上一秒的时间,因为当前秒可能日志取不全
current_time = last_second.strftime('%d-%b-%Y %T') #时间格式根据日志格式做修改
#current_time = '17-Jun-2016 14:17:20'
if not os.path.exists(seek_files):
with open(seek_files, 'w+') as s:
s.write(str(0))
def write_file_end(log_files, seek_files):
with open(log_files, 'r') as f: #先找到log的最后字节位置
f.seek(0, 2) #seek(0)移动到文件起始、(0,2)移动到结尾
end_seek = f.tell()
with open(seek_files, 'w+') as s:
s.write(str(end_seek)) #把log的最后字节位置记录到seek文件
def get_count(log_files, begin):
count = 0
dns_pattern = re.compile(current_time+r'\.(\w+)(\s+)'+"queries: info: client") #这个正则要根据你的日志格式来,可以放到前边,声明一个变量,我这图省事了
with open(log_files, 'r') as f: #打开log,并移位到seek中记录的地方,从那开始读取行数并做累加,读完以后在更新seek文件到最新点
f.seek(begin)
for line in f.xreadlines():
if dns_pattern.match(line):
count += 1
print(count)
if __name__ == '__main__':
try:
with open(seek_files, 'r') as t:
if len(t.read()) == 0: #seek文件为空,强制begin=0,不为空,begin就等于seek
begin = 0
else:
t.seek(0)
begin = int(t.read())
with open(log_files, 'r') as f: #拿到end,end值为log文件的最后位置
f.seek(0, 2)
end = f.tell()
if end < begin: #因为日志定期会切分,切分后log的end将为0,此时begin强制为0,不然输出的count将为0
begin = 0
get_count(log_files, begin) #得到上一秒的总行数
write_file_end(log_files, seek_files) #把日志最后的位置保存给seek文件,用于下一秒的获取
except Exception, e:
print(0)
#!/usr/b