阅读背景:

【原创】基于日志增量,统计qps,并基于ip排序

来源:互联网 
  • 增量统计日志行数(只统计上一秒)

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



你的当前访问异常,请进行认证后继续阅读剩余内容。

分享到: