2017-07-07 71 views
0

我試圖創建一個讀取不斷更新的日誌文件並獲取它的每一行的異步函數。這就是我現在所擁有的:Python日誌讀取器

async def log_reader(): 
    with open(LOG_PATH, "r", encoding='utf-8', errors='ignore') as logfile: 
     logfile.seek(0, os.SEEK_END) 
     while TRUE: 
      line = logfile.readline() 
      if not line: 
       await asyncio.sleep(0.2) 
       continue; 
      <do stuff> 

它工作正常,直到文件重新啓動。我在考慮檢查文件的大小是否比它小,這將意味着它被刷新,但我覺得必須有更好的選擇。

歡迎任何提示。

回答

0

刷新文件,你可以檢查它的inode。使用os.stat從路徑中獲取它,然後提取inode number。如果你得到的inode與前一個不同,你必須重新打開這個文件。 (所以這樣做使用with塊可能並不容易)

要優化它一點,所以你不總是查詢文件,你可以實現一些你可以輕鬆接受的超時,但是它比日誌行之間的通常延遲。

這將工作,如果文件已被替換,這是旋轉日誌文件的常用方法。如果文件只被截斷,它將不起作用。

+0

我已經試過您的版本: '開放(LOG_PATH, 「R」,編碼= 'UTF-8',錯誤= '忽略')作爲日誌文件: inodenum = os.stat(LOG_PATH)st_ino中] logfile.seek(0,os.SEEK_END) 同時不client.is_closed: 如果inodenum = os.stat(LOG_PATH)[st_ino中]: inodenum = os.stat(LOG_PATH)[st_ino中] logfile.seek (0,os.SEEK_END)' 但它似乎不適用於我:inode號碼不會更改 – Degranon

+0

@degranon如果inode更改,您不能只是回滾,因爲它是一個新文件。您需要關閉當前的並再次打開相同的路徑。但是,也許你的日誌旋轉只是截斷了文件。 (然後文件大小是唯一的指標)你必須找出一個。 – viraptor