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.
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
@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