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获取文件后缀名及批量更新目录下文件后缀名的方法
Nov 11 Python
python实现的DES加密算法和3DES加密算法实例
Jun 03 Python
Python检测网站链接是否已存在
Apr 07 Python
深入理解python函数递归和生成器
Jun 06 Python
Python 批量合并多个txt文件的实例讲解
May 08 Python
Python(PyS60)实现简单语音整点报时
Nov 18 Python
Python 获取命令行参数内容及参数个数的实例
Dec 20 Python
python代码实现TSNE降维数据可视化教程
Feb 28 Python
python3中datetime库,time库以及pandas中的时间函数区别与详解
Apr 16 Python
详解使用scrapy进行模拟登陆三种方式
Feb 21 Python
理解深度学习之深度学习简介
Apr 14 Python
Python预测分词的实现
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
php 传值赋值与引用赋值的区别
2010/12/29 PHP
php学习之function的用法
2012/07/14 PHP
PHP输出XML到页面的3种方法详解
2013/06/06 PHP
PHP实现的数独求解问题示例
2017/04/18 PHP
php在windows环境下获得cpu内存实时使用率(推荐)
2018/02/08 PHP
JSON扫盲帖 JSON.as类教程
2009/02/16 Javascript
jQuery学习2 选择器的使用说明
2010/02/07 Javascript
JavaScript Event学习第二章 Event浏览器兼容性
2010/02/07 Javascript
javascript offsetX与layerX区别
2010/03/12 Javascript
40个新鲜出炉的jQuery 插件和免费教程[上]
2012/07/24 Javascript
JavaScript控制两个列表框listbox左右交换数据的方法
2015/03/18 Javascript
jQuery.Uploadify插件实现带进度条的批量上传功能
2016/06/08 Javascript
javascript数组常用方法汇总
2016/09/10 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
微信小程序 后台登录(非微信账号)实例详解
2017/03/31 Javascript
使用javascript做在线算法编程
2018/05/25 Javascript
使用Webpack提升Vue.js应用程序的4种方法(翻译)
2019/10/09 Javascript
微信小程序swiper左右扩展各显示一半代码实例
2019/12/05 Javascript
JS实现简单的表格增删
2020/01/16 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
[05:03]2018DOTA2亚洲邀请赛主赛事首日回顾
2018/04/04 DOTA
[40:04]Secret vs Infamous 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.23
2019/09/05 DOTA
python自动安装pip
2014/04/24 Python
python多维数组切片方法
2018/04/13 Python
解决python有时候import不了当前的包问题
2019/08/28 Python
解决TensorFlow调用Keras库函数存在的问题
2020/07/06 Python
Python 解析库json及jsonpath pickle的实现
2020/08/17 Python
如何查看python关键字
2021/01/17 Python
python3定位并识别图片验证码实现自动登录功能
2021/01/29 Python
HTML5全屏(Fullscreen)API详细介绍
2015/04/24 HTML / CSS
网络方面基础面试题
2012/11/16 面试题
中职生自我鉴定范文
2013/10/03 职场文书
关于护士节的演讲稿
2014/05/26 职场文书
标准版离职证明书
2014/09/12 职场文书
烈士陵园扫墓感想
2015/08/07 职场文书
会计入职心得体会
2016/01/22 职场文书