python实现实时监控文件的方法


Posted in Python onAugust 26, 2016

在业务稳定性要求比较高的情况下,运维为能及时发现问题,有时需要对应用程序的日志进行实时分析,当符合某个条件时就立刻报警,而不是被动等待出问题后去解决,比如要监控nginx的$request_time和$upstream_response_time时间,分析出最耗时的请求,然后去改进代码,这时就要对日志进行实时分析了,发现时间长的语句就要报警出来,提醒开发人员要关注,当然这是其中一个应用场景,通过这种监控方式还可以应用到任何需要判断或分析文件的地方,所以今天我们就来看看如何用python实现实时监控文件,我给三个方法实例::

第一种:

这个是最简单的和容易理解的,因为大家都知道linux下有tail命令,所以你可以直接用Popen()函数去调用这个命令来执行获取输出,代码如下:

logfile='access.log'
command='tail -f ‘+logfile+'|grep “timeout”‘
popen=subprocess.Popen(command,stdout=subprocess.PIPE,stderr=subprocess.PIPE,shell=True)
while True:
line=popen.stdout.readline().strip()
print line

第二种:

采用python对文件的操作来实现,用文件对象的tell(), seek()方法分别得到当前文件位置和要移动到的位置,代码如下:

import time
file = open(‘access.log')
while 1:
where = file.tell()
line = file.readline()
if not line:
time.sleep(1)
file.seek(where)
else:
print line,

第三种:

利用python的 yield来实现一个生成器函数,然后调用这个生成器函数,这样当日志文件有变化时就打印新的行,代码如下:

import time
def follow(thefile):
thefile.seek(0,2)
while True:
line = thefile.readline()
if not line:
time.sleep(0.1)
continue
yield line
if __name__ == ‘__main__':
logfile = open(“access-log”,”r”)
loglines = follow(logfile)
for line in loglines:
print line,

最后解释下seek()函数的用法,这个函数接收2个参数:file.seek(off, whence=0),从文件中移动off个操作标记(文件指针),正数往结束方向移动,负数往开始方向移动。如果设定了whence参数,就以whence设定的起始位为准,0代表从头开始,1代表当前位置,2代表文件最末尾位置。

以上就是三个常用方法,具体日志分析的代码大家可以根据自己的业务逻辑去实现,完毕。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
自己使用总结Python程序代码片段
Jun 02 Python
基于Python的关键字监控及告警
Jul 06 Python
python监控linux内存并写入mongodb(推荐)
Sep 11 Python
Python实现将HTML转换成doc格式文件的方法示例
Nov 20 Python
如何利用python查找电脑文件
Apr 27 Python
使用anaconda的pip安装第三方python包的操作步骤
Jun 11 Python
浅析Python3中的对象垃圾收集机制
Jun 06 Python
用python做游戏的细节详解
Jun 25 Python
Python学习笔记之函数的参数和返回值的使用
Nov 20 Python
pytorch获取模型某一层参数名及参数值方式
Dec 30 Python
Python requests接口测试实现代码
Sep 08 Python
python自动计算图像数据集的RGB均值
Jun 18 Python
Python爬取京东的商品分类与链接
Aug 26 #Python
Python设计模式之抽象工厂模式
Aug 25 #Python
简单谈谈python中的Queue与多进程
Aug 25 #Python
利用Python自动监控网站并发送邮件告警的方法
Aug 24 #Python
巧用python和libnmapd,提取Nmap扫描结果
Aug 23 #Python
Python中属性和描述符的正确使用
Aug 23 #Python
Python实现基本线性数据结构
Aug 22 #Python
You might like
德生PL660的电路分析和打磨
2021/03/02 无线电
模仿OSO的论坛(一)
2006/10/09 PHP
PHP不用递归实现无限分级的例子分享
2014/04/18 PHP
PHP和Mysql中转UTF8编码问题汇总
2015/10/10 PHP
浅析php如何实现App常用的秒发功能
2016/08/03 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
JS array 数组详解
2009/03/22 Javascript
理解Javascript_12_执行模型浅析
2010/10/18 Javascript
使用Firebug对js进行断点调试的图文方法
2011/04/02 Javascript
JS自动缩小超出大小的图片
2012/10/12 Javascript
JQuery对class属性的操作实现按钮开关效果
2013/10/11 Javascript
Query中click(),bind(),live(),delegate()的区别
2013/11/19 Javascript
js获取UserControl内容为拼html时提供方便
2014/11/02 Javascript
JavaScript DOM事件(笔记)
2015/04/08 Javascript
php基于redis处理session的方法
2016/03/14 Javascript
IScroll5 中文API参数说明和调用方法
2016/05/21 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
基于JavaScript实现前端文件的断点续传
2016/10/17 Javascript
jQuery实现的弹幕效果完整实例
2017/09/06 jQuery
AngularJS实现的select二级联动下拉菜单功能示例
2017/10/25 Javascript
在 vue-cli v3.0 中使用 SCSS/SASS的方法
2018/06/14 Javascript
vue通过滚动行为实现从列表到详情,返回列表原位置的方法
2018/08/31 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
详解小程序循环require之坑
2019/03/08 Javascript
使用Vue实现简单计算器
2020/02/25 Javascript
在vant 中使用cell组件 定义图标该图片和位置操作
2020/11/02 Javascript
Python3爬虫爬取百姓网列表并保存为json功能示例【基于request、lxml和json模块】
2018/12/05 Python
python如何控制进程或者线程的个数
2020/10/16 Python
python 如何引入协程和原理分析
2020/11/30 Python
详解python中的异常捕获
2020/12/15 Python
卡骆驰新加坡官网:Crocs新加坡
2018/06/12 全球购物
工地质量标语
2014/06/12 职场文书
旗帜观后感
2015/06/08 职场文书
高温慰问简报
2015/07/21 职场文书
快消品行业营销模式与盈利模式分享
2019/09/27 职场文书