2017-07-07 1 views
0

Ich versuche, eine asynchrone Funktion zu erstellen, die die ständig aktualisierende Protokolldatei liest und jede Zeile davon abruft. Das ist, was ich für jetzt habe:Python-Log-Reader

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> 

Es funktioniert gut, bis die Datei neu gestartet wird. Ich habe darüber nachgedacht zu prüfen, ob die Größe der Datei kleiner wurde als sie war, das würde bedeuten, dass sie aufgefrischt wurde, aber ich denke, dass es dafür eine bessere Option geben muss.

Alle Tipps sind willkommen.

Antwort

0

Zum Aktualisieren der Datei können Sie deren Inode überprüfen. Holen Sie es aus dem Pfad mit os.stat und extrahieren Sie dann die inode number. Wenn der eingehende Inode anders ist als der vorherige, müssen Sie die Datei erneut öffnen. (Dies ist mit with Block möglicherweise nicht einfach)

Um es ein wenig zu optimieren, so dass Sie die Datei nicht die ganze Zeit abfragen, können Sie einige Zeitüberschreitung implementieren, die Sie leicht akzeptieren können, aber die höher als ist die übliche Verzögerung zwischen den Protokollzeilen.

Dies funktioniert, wenn die Datei ersetzt wurde, was die übliche Methode zum Rotieren von Logfiles ist. Es funktioniert nicht, wenn die Datei nur abgeschnitten wurde.

+0

Ich habe Ihre Version versucht: 'mit offenem (log_path, "r", encoding = 'utf-8', Fehler = 'ignorieren') als Logdatei: inodenum = os.stat (log_path) [ST_INO ] logfile.seek (0, os.SEEK_END) während nicht client.is_closed: wenn inodenum = os.stat (log_path) [ST_INO]: inodenum = os.stat (log_path) [ST_INO] logfile.seek (0, os.SEEK_END) ' Aber es scheint, dass es für mich nicht funktioniert: die Inode-Nummer ändert sich nicht – Degranon

+0

@degranon Wenn der Inode ändert, können Sie nicht nur Rollback, weil es eine neue Datei ist. Sie müssen den aktuellen schließen und den gleichen Pfad erneut öffnen. Aber vielleicht wird die Datei durch die Log-Rotation abgeschnitten. (Dann ist die Dateigröße der einzige Indikator) Sie müssen das herausfinden. – viraptor