• 增量统计日志行数(只统计上一秒)

dns_qps.py

#!/usr/bin/env python
#_*_coding:utf-8_*_import datetime
import re
import oslog_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 = 0dns_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 += 1print(count)if __name__ == '__main__':try:with open(seek_files, 'r') as t:if len(t.read()) == 0:  #seek文件为空,强制begin=0,不为空,begin就等于seekbegin = 0else: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将为0begin = 0get_count(log_files, begin)  #得到上一秒的总行数write_file_end(log_files, seek_files)  #把日志最后的位置保存给seek文件,用于下一秒的获取except Exception, e:print(0)

注意事项
把这个脚本放在zabbix之类的监控里,一秒执行一次,就可以算出每秒(其实是上一秒)增量部分的行数了,然后zabbix拿着这个度数绘图

# 运行脚本
/usr/bin/python2.6 dns_qps.py

下边更进一步,拿着这个增量,基于源ip,我们再做一个排序,把排序结果记录到一个log里

  • 增量统计日志(tcpdump出来的数据)并排序,记录日志

dns_request_sort.py

#!/usr/bin/env python
#_*_coding:utf-8_*_import datetime
import re
import os
import logging
import sysmaster_dir = "/Data/logs/dns_qps/tcpdump_53"  #把tcpdump的数据放这个目录里,原生的tcpdump数据
today = datetime.datetime.now().strftime('%Y%m%d')
log_files = os.path.join(master_dir, today+'.log'),
log_files = log_files[0]
if not os.path.exists(log_files):sys.exit('Can not find logfile')# for tcpdump
seek_files = '/tmp/seek_log_4_tcpdump_53.tmp'  #同理存放seek信息的
last_second = datetime.datetime.now() - datetime.timedelta(seconds=1)  #取上一秒的时间,因为当前秒可能日志取不全
current_time = last_second.strftime('%T')
#current_time = '16:54:17'
warning_num = 4  #设定阈值
warning_log = "/Data/logs/dns_qps/dns_warning_sort.log"  #生成的排序ip的日志def Mylogger(msg, logfile, level='info'):logging.basicConfig(level=logging.INFO,format='%(asctime)s [%(levelname)s] %(message)s',filename=logfile,filemode='a+')if level == 'critical':logging.critical(msg)elif level == 'error':logging.error(msg)elif level == 'warn':logging.warn(msg)elif level == 'info':logging.info(msg)else:logging.debug(msg)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)end_seek = f.tell()with open(seek_files, 'w+') as s:s.write(str(end_seek))  #把log的最后字节位置记录到seek文件def get_count(log_files, begin):dns_pattern = re.compile(current_time+r'\.\d+ IP (\d+\.\d+\.\d+\.\d+)\.\d+[\s\S]*')ip_list = []with open(log_files, 'r') as f:  #打开log,并移位到seek中记录的地方,从那开始读取行数并做累加,读完以后在更新seek文件到最新点f.seek(begin)for line in f.xreadlines():if dns_pattern.match(line):ip_list.append(dns_pattern.match(line).groups()[0])  #groups()[0]是匹配的ip字段for item in set(ip_list):  #最后得到一个大列表,里边放着一秒内的多个ip,可能有重叠,set()去重并循环它,每个item就是一个ipif ip_list.count(item) >= warning_num:  #列表中出现的ip的数量超过阈值就记录日志Mylogger("%s %s 此IP: %s 访问达到 %d 次" % (today, current_time, item, ip_list.count(item)),warning_log, level='warn')if __name__ == '__main__':try:with open(seek_files, 'r') as t:if len(t.read()) == 0:begin = 0else:t.seek(0)begin = int(t.read())with open(log_files, 'r') as f:f.seek(0, 2)end = f.tell()if end < begin:  #因为日志定期会切分,切分后log的end将为0,此时begin强制为0,不然输出的count将为0begin = 0get_count(log_files, begin)write_file_end(log_files, seek_files)except Exception, e:pass

最后附上跑tcpdump的那个脚本
本来想用python的pypcap来抓取数据包,然后用dpkt来分析的,但测了一下,抓出来的东西都是乱码,就放弃了,直接用shell调用tcpdump脚本了
while_53.sh

#!/usr/bin/env bashmaster_dir="/Data/logs/dns_qps/tcpdump_53"
device="em1"
mkdir -p ${master_dir}
chown -R zabbix.zabbix ${master_dir}sudo /bin/kill -9 `ps -ef|grep tcpdump|grep -v grep|awk '{print$2}'` 2>/dev/null
today=`date +%Y%m%d`
sudo /usr/sbin/tcpdump -i ${device} -nn udp port 53|grep "> 10.*\.53:" >> ${master_dir}/${today}.log &

把2个脚本放到crontab跑起来

00 00 * * * cd /Data/shell && sh while_53.sh  #这个每天重启一次tcpdump用于按天分割日志
* * * * * cd /Data/shell && /usr/bin/python dns_request_sort.py  #没那么敏感的要求,一分钟跑一次足矣
# 看下生成的日志
2016-08-26 16:20:01,568 [WARNING] 20160826 16:20:00 此IP: 10.1.0.110 访问达到 70 次
2016-08-26 16:21:01,616 [WARNING] 20160826 16:21:00 此IP: 10.1.0.110 访问达到 67 次
2016-08-26 16:22:01,665 [WARNING] 20160826 16:22:00 此IP: 10.1.0.110 访问达到 68 次
2016-08-26 16:23:01,714 [WARNING] 20160826 16:23:00 此IP: 10.1.0.110 访问达到 65 次
2016-08-26 16:24:01,766 [WARNING] 20160826 16:24:00 此IP: 10.1.20.253 访问达到 100 次
2016-08-26 16:24:01,766 [WARNING] 20160826 16:24:00 此IP: 10.1.0.110 访问达到 72 次
2016-08-26 16:25:01,815 [WARNING] 20160826 16:25:00 此IP: 10.1.0.110 访问达到 59 次

转载于:https://www.cnblogs.com/caseast/p/5810686.html

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

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

    增量统计日志行数(只统计上一秒) dns_qps.py #!/usr/bin/env python #_*_coding:utf-8_*_ import datetime import re impo ...

  2. MySQL5.6主从复制搭建基于日志(binlog)

    什么是MySQL主从复制 简单来说,就是保证主SQL(Master)和从SQL(Slave)的数据是一致性的,向Master插入数据后,Slave会自动从Master把修改的数据同步过来(有一定的延迟 ...

  3. 2018年9月杭州云栖大会Workshop - 基于日志的安全分析实战

    基于日志的安全分析实战 背景 越来越多的企业开始重视构建基于日志的安全分析与防护系统.我们会讲述如何使用日志服务从0到1收集海量日志,并从中实时筛选.甄别出可疑操作并快速分析,进一步构建安全大盘与可视 ...

  4. 基于日志的交换机故障预测

    女主宣言 在当今Web服务数据中心网络中,网络设备的故障已经逐渐成为日常发生的事件.对于故障发生后如何处理,之前已经提出了很多的研究.不幸的是,数据中心部署的互联网服务的性能依然受到影响.本文介绍的是 ...

  5. 擎创技术流 | 基于日志的交换机故障预测

    夏洛克AIOps系统,分析包含日志数据.机器数据.网络数据等等在内的多样化数据. 同样,也经由海量数据分析进行多指标的异常预测.故障定位.本文虽然不是夏洛克系统的应用,也为异常检测及预测提供了一种思路 ...

  6. MySQL基于日志还原数据

    简介 Binlog日志,即二进制日志文件,用于记录用户对数据库操作的SQL语句信息,当发生数据误删除的时候我们可以通过binlog日志来还原已经删除的数据,还原数据的方法分为传统二进制文件还原数据和基 ...

  7. 电商推荐系统(上):推荐系统架构、数据模型、离线统计与机器学习推荐、历史热门商品、最近热门商品、商品平均得分统计推荐、基于隐语义模型的协同过滤推荐、用户商品推荐列表、商品相似度矩阵、模型评估和参数选取

    文章目录 第1章 项目体系架构设计 1.1 项目系统架构 1.2 项目数据流程 1.3 数据模型 第2章 工具环境搭建 2.1 MongoDB(单节点)环境配置 2.2 Redis(单节点)环境配置 ...

  8. 基于短语的统计机器翻(PBMT) 开源工具 :Moses

    如何运行Moses 1. Moses的历史 Moses是Pharaoh的升级版本,增加了许多功能.它是一个基于短语的统计机器翻译系统,整个系统用C++语言写成,从训练到解码完全开放源代码,可以运行在L ...

  9. 《机器学习与数据科学(基于R的统计学习方法)》——2.11 R中的SQL等价表述...

    本节书摘来异步社区<机器学习与数据科学(基于R的统计学习方法)>一书中的第2章,第2.11节,作者:[美]Daniel D. Gutierrez(古铁雷斯),更多章节内容可以访问云栖社区& ...

最新文章

  1. $sanitize和$sce服务的使用方法
  2. ICCV 2019 | COCO-GAN:通过条件坐标的部分图像生成
  3. Docker的常用操作
  4. Codeforces 510 E. Fox And Dinner
  5. 计算机网络与社会需求,计算机网络的技术论文计算机网络与社会需求.doc
  6. MongoDB3.x中添加用户和权限控制
  7. ubantu系统之快捷键使用
  8. AtCoder ARC 076D - Built?
  9. KTV用什么收银管理系统管店?
  10. java象棋人机_Java版中国象棋人机对战源代码,作者将AI算法用得淋漓尽致JAVA游戏源码下载...
  11. amos里CFA可行性辨别结果怎么看_AMOS 中验证性因素分析(CFA)
  12. 光学基本知识--概念辨析
  13. 迅雷下载原理和P2p技术
  14. TI芯片(335x、437x、572x)uboot设置logo居中
  15. 理解逻辑斯蒂回归模型
  16. UE4 C++入门之路1-C++和蓝图的关系和介绍
  17. 操作系统采用可变分区分配存储管理方法期末复习题
  18. C++报错:[Warning] statement has no effect [-Wunused-value]
  19. 简述java程序的工作过程_简述 Java 程序的开发过程。_学小易找答案
  20. 软件供应链攻击的新形式

热门文章

  1. 按钮固定在页面底端html,css实现按钮固定在底部
  2. IComparable和Icomparer接口
  3. php代码编写直接插入排序算法,PHP排序算法之直接插入排序(Straight Insertion Sort)实例分析...
  4. display none的元素重新展示如何撑开页面_关于元素的浮动你了解多少
  5. 95-00-030-环境-IDEA构建源码阅读环境
  6. 95-136-041-源码-Operator-AbstractStreamOperator
  7. 95-190-028-源码-window-Window介绍与使用md
  8. 【JAVA】Java中goto语句的简介与使用(java 如何跳出内嵌多层循环的方法)
  9. Spring : @Component注解
  10. 06-在IDEA中实战Git