python實現(xiàn)實時監(jiān)控文件的方法
在業(yè)務(wù)穩(wěn)定性要求比較高的情況下,運維為能及時發(fā)現(xiàn)問題,有時需要對應(yīng)用程序的日志進行實時分析,當符合某個條件時就立刻報警,而不是被動等待出問題后去解決,比如要監(jiān)控nginx的$request_time和$upstream_response_time時間,分析出最耗時的請求,然后去改進代碼,這時就要對日志進行實時分析了,發(fā)現(xiàn)時間長的語句就要報警出來,提醒開發(fā)人員要關(guān)注,當然這是其中一個應(yīng)用場景,通過這種監(jiān)控方式還可以應(yīng)用到任何需要判斷或分析文件的地方,所以今天我們就來看看如何用python實現(xiàn)實時監(jiān)控文件,我給三個方法實例::
第一種:
這個是最簡單的和容易理解的,因為大家都知道linux下有tail命令,所以你可以直接用Popen()函數(shù)去調(diào)用這個命令來執(zhí)行獲取輸出,代碼如下:
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對文件的操作來實現(xiàn),用文件對象的tell(), seek()方法分別得到當前文件位置和要移動到的位置,代碼如下:
import time file = open(‘a(chǎn)ccess.log') while 1: where = file.tell() line = file.readline() if not line: time.sleep(1) file.seek(where) else: print line,
第三種:
利用python的 yield來實現(xiàn)一個生成器函數(shù),然后調(diào)用這個生成器函數(shù),這樣當日志文件有變化時就打印新的行,代碼如下:
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()函數(shù)的用法,這個函數(shù)接收2個參數(shù):file.seek(off, whence=0),從文件中移動off個操作標記(文件指針),正數(shù)往結(jié)束方向移動,負數(shù)往開始方向移動。如果設(shè)定了whence參數(shù),就以whence設(shè)定的起始位為準,0代表從頭開始,1代表當前位置,2代表文件最末尾位置。
以上就是三個常用方法,具體日志分析的代碼大家可以根據(jù)自己的業(yè)務(wù)邏輯去實現(xiàn),完畢。
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
pandas數(shù)據(jù)處理基礎(chǔ)之篩選指定行或者指定列的數(shù)據(jù)
這篇文章主要介紹了pandas數(shù)據(jù)處理基礎(chǔ)之篩選指定行或者指定列的數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下2018-05-05教你用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容
這篇文章介紹的是利用python3根據(jù)關(guān)鍵詞爬取百度百科的內(nèi)容,注意本文用的是python3版本以及根據(jù)關(guān)鍵詞爬取,爬取也只是單純的爬網(wǎng)頁信息,有需要的可以參考借鑒。2016-08-08利用Python+阿里云實現(xiàn)DDNS動態(tài)域名解析的方法
這篇文章主要介紹了利用Python+阿里云實現(xiàn)DDNS動態(tài)域名解析的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2019-04-04