Ich bin mir nicht sicher, wie ich das schreiben soll, also tippe ich es aus und bearbeite und beantworte alle Fragen, die auftauchen.
Derzeit verwende ich auf meinem lokalen Netzwerkgerät (auf PHP4-Basis) eine Live-Systemprotokolldatei: Ссылка
Dies funktioniert gut und alle 1 Sekunde lädt es eine externe Seite (logfile.php), die eine tail -n 100 logfile.log
Das Skript führt keine Pufferung, so dass die Ergebnisse auf dem Bildschirm angezeigt werden die letzten 100 Zeilen aus der Protokolldatei.
Die logfile.php enthält:
%Vor%Dieser Teil funktioniert gut.
Ich habe die Seite logfile.php angepasst, um die $ outline zu einer neuen Textdatei zu schreiben, einfach mit fwrite($fp,$outputline."\n");
Während das funktioniert, habe ich Probleme mit der Duplizierung in der neuen Datei, die erstellt wird.
Offensichtlich erzeugt jedes Mal, wenn tail -n 100 ausgeführt wird, Ergebnisse, beim nächsten Mal könnten dieselben Zeilen erzeugt werden, da sich dies wiederholt, kann es zu mehreren Zeilen der Duplizierung in der neuen Textdatei kommen.
>Ich kann die Zeile, die ich gerade schreibe, nicht direkt mit vorherigen Zeilen vergleichen, da identische Übereinstimmungen möglich sind.
Gibt es eine Möglichkeit, diesen aktuellen Block von 100 Zeilen mit dem vorherigen Block zu vergleichen und dann nur die Zeilen zu schreiben, die nicht übereinstimmen. Wieder mögliche Ausgabe, dass Block A & amp; B enthält identische Zeilen, die benötigt werden ...
Ist es möglich, logfile.php zu aktualisieren, um die letzte Position in meiner Logdatei zu notieren und dann nur die nächsten 100 Zeilen von dort zu lesen und diese in die neue Datei zu schreiben?
Die Protokolldatei könnte bis zu 500 MB groß sein, damit ich sie nicht jedes Mal lesen möchte.
Irgendwelche Ratschläge oder Vorschläge sind willkommen.
Danke
UPDATE @ 16:30
Ich habe irgendwie funktioniert mit:
%Vor%Dies scheint zu funktionieren, aber es lädt zuerst die gesamte Datei und dann nur die Updates.
Wie würde ich es mit den letzten 50 Zeilen beginnen und dann nur die Updates?
Danke:)
UPDATE 04/06/2013 Während dies funktioniert, ist es sehr langsam mit großen Dateien.
Ich habe diesen Code ausprobiert und er scheint schneller, aber er liest nicht nur dort, wo er aufgehört hat.
%Vor%Irgendwie kann das geändert werden, so dass es von der letzten bekannten Position liest ..?
Danke
Einführung
Sie können eine Datei nachverfolgen, indem Sie die letzte Position verfolgen;
Beispiel
%Vor% TailLog
ist eine einfache Klasse, die ich für diese Aufgabe geschrieben habe. Hier ist ein einfaches Beispiel, um zu zeigen, dass es tatsächlich die Datei abschließt
Einfacher Test
%Vor%Ausgabe
%Vor%Echtzeit-Tailing
%Vor%Hinweis: Wenn Sie 100 Zeilen zurückziehen, heißt das nicht, dass immer 100 Zeilen zurückgegeben werden. Es würde neue Zeilen hinzufügen hinzugefügt 100 ist nur die maximale Anzahl der Zeilen zurückgeben. Dies ist möglicherweise nicht effizient, wenn Sie eine starke Protokollierung von mehr als 100 Zeilen pro Sekunde durchführen, wenn es ein
gibt
Schwanzklasse
%Vor%Tail Lock
%Vor%Nicht wirklich klar, wie Sie die Ausgabe verwenden möchten, aber so etwas würde funktionieren ....
%Vor%tracker.dat ist nur eine Textdatei, die angibt, wo sich die gelesene Position vom vorherigen Lauf befand. Ich suche nur nach dieser Position und verbinde den Rest mit dem Ausgabepuffer.
Verwenden Sie tail -c <number of bytes
anstelle der Anzahl der Zeilen und überprüfen Sie dann die Dateigröße. Die grobe Idee ist:
Der Vorteil ist, dass Sie alle speziellen Verarbeitungsmaterialien weglassen und eine gute Leistung erzielen können. Der Nachteil ist, dass Sie die Ausgabe manuell in Zeilen aufteilen müssen, und wahrscheinlich könnten Sie mit unvollständigen Zeilen enden. Aber das ist keine große Sache, Sie können leicht umgehen, indem Sie die letzte Zeile allein aus der Ausgabe weglassen (und die letzte Zeilenanzahl der Bytes von old_file_size
subtrahieren).