Dateisegmente basierend auf der Zeit ausschneiden, zu der die Zeilen geschrieben wurden

Dateisegmente basierend auf der Zeit ausschneiden, zu der die Zeilen geschrieben wurden

bei mir läuft immer ein Prozess mit einer Protokolldatei, die bis zu 5 Gigabyte groß sein kann. Manchmal muss ich basierend auf einem Zeitintervall einen Ausschnitt aus diesem Protokoll erstellen (normalerweise verwende ich dd). Gibt es in Linux einen Befehl, um basierend auf einem Zeitintervall einen Ausschnitt aus dem Protokoll zu erstellen?

PS: Die meisten Zeilen dieses Protokolls enthalten keinen Zeitstempel.

Antwort1

Wenn es keinen Befehl gibt, der Ihnen dies ermöglicht (wie von Wiese vorgeschlagen), warum erstellen Sie dann keinen externen Index Ihrer Datei?

Nur die Idee: Sie können ein Skript erstellen, das ewig (oder fast ewig) läuft, siehe Hinweise unten, und die Zeitintervalle für die Erstellung des Index angeben.

PIDofThisInstance=$$
# ... you code for the header, checks... 
while true  ; do
  # This is the core of your cycle
    sync   # Maybe
    CurrentSize=`ls -s $MyFile  | awk '{print $1} ' `
    CurrentTime=`date +"%Y%m%d%H%M%S"`
    echo $CurrentTime $CurrentSize >> $Log_Of_My_Log_File
    sleep $TimeToSleep
  # if (exit-condition)
  # then
  #    break           #Exit from the infinite loop.
  # fi
done 

Anschließend können Sie ein weiteres Skript ausführen, das Ihnen bei Angabe des Start-/Enddatums/der Start-/Endzeit die Start-/Endgrößen angibt. Anhand dieser Zahlen können Sie Ihre Datei zuschneiden.

Sie sagten, es sei eine riesige Datei. Ich schlage Ihnen also nicht vor, dies zu tun.Linien Nummernund vielleicht head MyFile.log -n xxx | tail -n yyy. Es wird lang. Besser, mit der Größe zu arbeiten.

Anmerkungen:

  • Wenn es sich um ein Protokoll mit formatierter Ausgabe handelt (auch wenn Sie dies nicht wissen), ist es immer möglich, dass es ein Analysetool der Entwicklerfirma/des Programmierers gibt. Es ist möglich, dass es auch nach Jahren noch herauskommt. Meiner Meinung nach ist es besser, dieses Format nicht zu ändern und eine separate Datei zu erstellen.
  • Schreiben Sie in Ihre Skriptparameter beispielsweise die aktuelle PID (falls Sie sie manuell beenden müssen), den Namen der Datei (Objekt der Protokollierung), wenn Sie die PID des Programms kennen, das das Protokoll generiert …
  • Der Zyklus kann endlos sein oder enden, wenn eine Bedingung wie die folgende vorliegt: Die PID des Programms, das das Protokoll generiert, existiert nicht mehr, die Datei existiert nicht mehr, die tatsächliche Größe ist kleiner als die alte (Sie verschieben die Datei oder starten das Protokoll neu, Sie müssen die Indizierung neu starten).
  • Wenn Sie $LastSize im Speicher behalten, können Sie entscheiden, das Drucken von Zeilen im „Protokoll des Protokolls“ zu vermeiden, wenn es nicht benötigt wird, oder nach einer langen Zeit ohne Aktivität anzuhalten (oder das Zeitintervall dynamisch zu ändern …)

verwandte Informationen