So lesen Sie die letzten Zeilen aus einer großen Datei mit Go alle 10 Sekunden

8

Wie kann ich die letzten zwei Zeilen aus einer großen Protokolldatei lesen, ohne sie vollständig in den Speicher zu laden?

Ich muss es alle 10 Sekunden lesen (auf einem Win-Rechner) ... und ich bleibe stecken und versuche, die letzten Zeilen zu lesen.

%Vor%

Die Protokolldatei ist ungefähr wie folgt:

%Vor%

Danke!

    
Goku 25.07.2013, 16:36
quelle

3 Antworten

9

Sie können file.Seek () oder file.ReadAt () bis fast zum Ende und dann weiterlesen. Sie können nur schätzen, wo Sie anfangen zu suchen, es sei denn, Sie können wissen, dass 2 Zeilen = x Bytes.

Sie können die Dateilänge mit dem os.Stat (Name)

ermitteln

Hier ist ein Beispiel basierend auf ReadAt, Stat und Ihrer Beispielprotokolldatei:

%Vor%     
Joshua 25.07.2013, 16:52
quelle
3

Ich denke, eine Kombination von File.Seek(0, 2) und File.Read() sollte funktionieren.

Der Aufruf Seek bringt Sie zum Ende der Datei. Sie können Seek auf eine Position etwas vor dem EOF setzen, um die letzten paar Zeilen zu erhalten. Dann gehst du Read bis zum EOF und schläfst nur 10 Sekunden lang in deiner Goroutine; next Read hat eine Chance, Ihnen mehr Daten zu beschaffen.

Sie können die Idee (und die Scan-Back-Logik für das anfängliche Anzeigen einiger letzter Zeilen) von Quelle GNU tail .

    
9000 25.07.2013 16:53
quelle
1

Nun, das ist nur eine rohe Idee und vielleicht nicht der beste Weg, Sie sollten es überprüfen und verbessern, aber es scheint zu funktionieren ...

Ich hoffe, dass erfahrene Go-Benutzer auch dazu beitragen können ..

Mit Stat können Sie die Größe der Datei ermitteln und daraus den Offset für die Verwendung mit ReadAt

%Vor%     
chespinoza 25.07.2013 17:35
quelle

Tags und Links