python 實現 linux tailf 功能
阿新 • • 發佈:2019-02-08
python 實時輸出日誌文字資訊:
#!/usr/bin/python
# -*- coding:utf-8 -*-
import time
class file_read:
def __init__(self, logname):
self.logname = logname
def file_readlines(self, line):
print line,
def file_readline(self):
f = open(self.logname, 'r')
f.seek(0, 2)
while True:
offset = f.tell()
line = f.readline()
if not line:
f.seek(offset)
time.sleep(3)
else:
self.file_readlines(line)
f.close()
if __name__ == '__main__':
a = file_read('./file.txt')
a.file_readline()
由於每天會通過 logrotate 進行日誌切割,而切割完之後即使新建一個name相同的檔案,那麼程式還是需要再跑一遍
下面的程式主要通過 before_time 和 after_time 以及 offset 的判斷,如果 offset 偏移值相同,而 time 發生變化的話說明檔案已經被切割,從而 f.close() 並且 open 重新開啟檔案。
#!/usr/bin/python
# -*- coding:utf-8 -*-
import os.path
import time
class file_read:
def __init__(self, logname) :
self.logname = logname
def get_time(self, logname): # get_time 函式用來獲取時間
if os.path.exists(logname):
return time.ctime(os.path.getctime(logname))
else: # 如果logname不存在,則輸出提示資訊,並且重新執行(self.get_time(logname))獲取時間,直到獲取到log為止
print str(logname) + 'is not exists'
time.sleep(1)
self.get_time(logname)
def file_readlines(self, line): # 定義行輸出函式
print line,
def file_readline(self):
if not os.path.exists(self.logname):
print str(self.logname) + 'is not exists'
time.sleep(1)
self.file_readline() # 如果logname不存在,則接著執行該函式self.file_readline()
f = open(self.logname) # 開啟日誌檔案
f.seek(0, 2) # 移動到檔案尾部
while True:
before_ctime = self.get_time(self.logname) # 獲取之前的時間
before_offset = f.tell() # 獲取之前的偏移值
line = f.readline() # 獲取新行
if not line: # 判斷新行是否獲取成功,如果沒有獲取成功,則獲取之後的時間和偏移值
after_ctime = self.get_time(self.logname)
after_offset = f.tell()
# 判斷在檔案偏移值沒有變化的情況下,ctime時間是否相同,如果不同,則表示檔案被切割,重新開啟並讀取內容
if before_ctime != after_ctime and before_offset == after_offset and os.path.exists(self.logname):
f.close()
f = open(self.logname, 'r')
line = f.readline()
self.file_readlines(line)
else:
self.file_readlines(line) # 如果有獲取到新行,則進行列印
f.close()
if __name__ == '__main__':
a = file_read('./file.txt')
a.file_readline()