1. 程式人生 > >python 實現 linux tailf 功能

python 實現 linux tailf 功能

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()