Linux / Befehl tail: Das Ende einer Datei anzeigen und Logs verfolgen
tail ist ein Linux-Befehl, der verwendet wird, um den Endteil einer Datei zu überprüfen. Wenn er ohne Optionen ausgeführt wird, gibt er die letzten 10 Zeilen aus. Sie können die Anzahl der Zeilen mit -n angeben und neu hinzugefügte Protokolle kontinuierlich mit -f oder -F überwachen.
Es ist besonders nützlich, um Protokolle kurz vor Auftreten eines Problems schnell zu überprüfen oder um Protokolle eines laufenden Dienstes zu beobachten. In diesem Artikel erklären wir die Grundlagen der Syntax, Methoden der Verfolgung unter Berücksichtigung der Protokollrotation, Filterung und Überwachung mehrerer Dateien anhand von realen Beispielen.
tail-Befehl
tail gibt den letzten Teil der Texteingabe aus. Wenn keine Datei angegeben ist oder - anstelle einer Datei verwendet wird, liest es von der Standardeingabe. Die Standardausgabeeinheit sind Zeilen, und ohne spezielle Optionen werden die letzten 10 Zeilen angezeigt.
Es ist praktisch, das Ende großer Logdateien zu überprüfen, ohne die gesamte Datei zu öffnen. tail ist jedoch kein Werkzeug zum Analysieren oder Archivieren von Logs; es ist ein Werkzeug zum Lesen des Endes einer Datei und zum Verfolgen ihrer Änderungen.
Grundlegende Syntax und Verwendung
Die grundlegende Syntax ist wie folgt. Klammern kennzeichnen optionale Elemente und sollten im eigentlichen Befehl nicht enthalten sein.
tail [options] [file...]
Beispielsweise, um die letzten 10 Zeilen von /var/log/app.log zu überprüfen, führen Sie Folgendes aus.
tail /var/log/app.log
Wenn Sie die letzten 20 Zeilen benötigen, geben Sie die Anzahl der Zeilen mit der -n-Option an.
tail -n 20 /var/log/app.log
Sie können es kurz wie -20 schreiben, aber in Skripten und Dokumenten ist das lesbarere Format -n 20 klarer.
So drucken Sie nur den gewünschten Bereich
Drucken der letzten N Zeilen
-n N druckt N Zeilen vom Ende der Datei. Es wird verwendet, um aktuelle Anfragen oder Fehler über einen bestimmten Bereich zu überprüfen.
tail -n 50 access.log
Wenn Sie die Ausgabe seitenweise lesen möchten, können Sie sie an less weiterleiten.
tail -n 500 access.log | less
Drucken ab der N-ten Zeile bis zum Ende
Ein Pluszeichen vor der Zahl -n +N hat eine andere Bedeutung. Anstatt die letzten N Zeilen auszugeben, werden die Zeilen ab der N-ten Zeile der Datei bis zum Ende ausgegeben.
tail -n +2 data.csv
Dieses Beispiel gibt ab der zweiten Zeile einer CSV-Datei aus und schließt die erste Zeile, die der Header ist, aus. Es kann leicht verwendet werden, wenn die erste Zeile in einer Pipeline übersprungen werden soll.
Ausgabe nach Bytes anstelle von Zeilen
-c N gibt die letzten N Bytes anstelle von Zeilen aus. Sie können Suffixe wie K oder M verwenden.
tail -c 1K output.bin
-c +N gibt ab dem N-ten Byte bis zum Ende aus. Wenn Sie nach Bytes schneiden, kann ein Multibyte-Zeichen in der Mitte geteilt werden, daher ist es normalerweise sicherer, für Multibyte-Text -n zu verwenden.
Kontinuierlich neu hinzugefügte Logs anzeigen
Die mit -f geöffnete Datei kontinuierlich verfolgen
-f gibt zuerst das Ende der Datei aus und zeigt dann fortlaufend alle neuen Inhalte an, die zur Datei hinzugefügt werden. Das Standardverhalten folgt dem offenen Dateideskriptor, was es für Situationen geeignet macht, in denen Logs kontinuierlich zur selben Datei hinzugefügt werden.
tail -f /var/log/app.log
Um die Verfolgung zu beenden, drücken Sie Strg+C.
Mit -F die Logrotation behandeln
In einer Betriebsumgebung können sich Logdateien ändern und nach Erreichen einer bestimmten Größe oder Zeitspanne durch neue Dateien ersetzt werden. Dies wird Logrotation genannt. GNU tails -F entspricht --follow=name --retry, das versucht, basierend auf dem Dateinamen erneut zu öffnen.
tail -F /var/log/app.log
Daher ist beim Beobachten von häufig rotierten Servicelogs über einen längeren Zeitraum -F oft praktischer als -f. Dieses Verhalten kann in der offiziellen GNU Coreutils tail Dokumentation überprüft werden.
Nur neue Logs ohne vorhandenen Inhalt anzeigen
Wenn die letzten 10 Zeilen des vorhandenen Inhalts beim Ausführen von -f nicht benötigt werden, verwenden Sie -n 0 zusammen. Es werden nur Zeilen angezeigt, die nach der Befehlsausführung hinzugefügt wurden.
tail -n 0 -f /var/log/app.log
Häufig verwendete Optionen
| Option | Funktion | Beispiele für die Verwendung |
|---|---|---|
-n N |
Drucken der letzten N Zeilen | tail -n 100 app.log |
-n +N |
Ab der N-ten Zeile drucken | tail -n +2 data.csv |
-c N |
Die letzten N Bytes drucken | tail -c 2K data.bin |
-f |
Verfolge zusätzlichen Inhalt einer offenen Datei | Beobachte eine einzelne Datei, die kontinuierlich beschrieben wird |
-F |
Verfolge und wiederhole basierend auf dem Dateinamen | Beobachte rotierende Protokolle |
-s N |
Setze das Prüfintervall für das Tracking auf N Sekunden | tail -f -s 2 app.log |
--pid=PID |
Beende das Tracking, nachdem der angegebene Prozess beendet ist | Verwende mit Batch-Job-Protokollen |
-q |
Dateinamensheader ausblenden | Mehrere Dateiausgaben als eine behandeln |
-v |
Dateinamen-Header immer anzeigen | Quellendateien klar unterscheiden |
Der detaillierte Unterstützungsbereich von Optionen kann je nach Betriebssystem und der tail-Implementierung variieren. Besonders beim Verwenden von -F und --pid in einem Skript wird empfohlen, die Unterstützung auf dem Zielsystem mit tail --help zu überprüfen.
Praktische Beispiele zur Überprüfung von Logs
Nur aktuelle Fehler finden
Zuerst nur die letzten 200 Zeilen lesen, dann grep verwenden, um Fehlerzeichenketten zu filtern und die Notwendigkeit zu reduzieren, in großen alten Logs zu suchen.
tail -n 200 app.log | grep 'ERROR'
Um die Groß-/Kleinschreibung zu ignorieren, verwenden Sie grep -i, und wenn Zeilennummern benötigt werden, verwenden Sie grep -n.
Nur neue Fehler kontinuierlich anzeigen
Wenn Sie den rotierenden Logs folgen und nur die Fehlerzeilen sehen möchten, kombinieren Sie die Befehle wie folgt. GNU grep's --line-buffered hilft, die Ausgabeverzögerung in der Pipe zu reduzieren, indem jede Zeile sofort übergeben wird.
tail -F app.log | grep --line-buffered 'ERROR'
Diese Methode verengt nur, was auf dem Bildschirm angezeigt wird, und ändert das ursprüngliche Log nicht. Wenn Sie mehrere Bedingungen oder eine strukturierte Log-Analyse benötigen, ist es besser, dedizierte Werkzeuge zur Log-Erfassung und -Suche in Betracht zu ziehen.
Mehrere Logdateien gleichzeitig ansehen
Sie können mehrere Dateien mit tail angeben. In diesem Fall wird eine Dateikopfzeile angezeigt, damit Sie erkennen können, von welcher Datei die Ausgabe stammt.
tail -F access.log error.log
Um die Ausgabe für jede Datei deutlicher zu machen, fügen Sie -v hinzu, und wenn der Kopfzeile nicht notwendig ist, verwenden Sie -q.
Die Verfolgung beim Prozessende beenden
In GNU tail können Sie --pid verwenden, um das Folgen einer Datei nach dem Ende eines bestimmten Prozesses zu stoppen. Im folgenden Beispiel ist $! die ID des zuletzt im Hintergrund ausgeführten Prozesses in der Shell.
some_command > build.log 2>&1 & tail --pid=$! -f build.log
Überprüfung von --pid funktioniert zusammen mit -f, und die Beendigungserkennung kann nicht sofort erfolgen. In der Automatisierung sollten Sie auch separat den Exit-Code des Befehls und die Protokolldateien überprüfen.
Der Unterschied zwischen -f und -F
| Kategorie | -f |
-F |
|---|---|---|
| Verfolgungskriterien | Im Grunde genommen ein offener Dateideskriptor | Der angegebene Dateiname |
| Dateiersatz | Kann weiterhin die zuvor geöffnete Datei sehen | Eine neue Datei mit demselben Namen erneut öffnen |
| Datei vorübergehend abwesend | Im Allgemeinen schwierig, die Nachverfolgung fortzusetzen | Warten Sie, bis sie mit der Aktion --retry wieder erscheint |
| Empfohlene Situationen | Kurzzeitbeobachtung von Dateien, die nicht ersetzt werden | Langzeitbeobachtung von rotierten Servicelogs |
-F ist nicht immer besser. In besonderen Fällen, in denen ein Prozess weiterhin in eine bestehende Datei schreibt, deren Name sich geändert hat, kann das Offenhalten der Datei mit -f besser zeigen, was benötigt wird. Die Wahl sollte auf der Methode der Log-Erstellung und der Rotationsrichtlinie basieren.
Wenn Tail nicht geeignet ist
- Systemd-Journal: Wenn Protokolle im Journal und nicht als einfache Textdateien gespeichert werden, verwenden Sie
journalctl -f. Für bestimmte Dienste können Sie es mitjournalctl -f -u service_nameeingrenzen. - Überprüfung des Beginns: Für die ersten Zeilen einer Datei ist
headeinfacher. - Lesen während der Bewegung: Um sowohl vergangene als auch neue Inhalte zu überprüfen, kann
less +F filenamepraktisch sein. Stoppen Sie das Folgen mit Ctrl+C, bewegen Sie sich nach oben und unten, und setzen Sie das Folgen mit F fort. - Periodische Aktualisierung von Befehlsresultaten: Wenn Sie wiederholt die neuesten Ergebnisse eines Befehls überprüfen möchten, anstatt zusätzliche Teile einer Datei, ist die Verwendung des Linux watch-Befehls besser für diesen Zweck geeignet.
- Zentralisierte Logs im großen Maßstab: Wenn Sie Protokolle von mehreren Servern über einen langen Zeitraum durchsuchen, zusammenführen und daraufhin Benachrichtigungen erhalten müssen, ist ein zentrales Logging-System oder ein Observability-Tool erforderlich.
Zu berücksichtigende Punkte bei Berechtigungen und Betriebssystemumgebung
Fehler „Zugriff verweigert"
Wenn Sie keine Leseberechtigung für die Protokolldatei haben, tritt ein Permission denied-Fehler auf. Überprüfen Sie zunächst den Besitzer und die Berechtigungen mit ls -l filename und fordern Sie die erforderlichen Berechtigungen sicher beim Administrator an. Vermeiden Sie es, Berechtigungen wahllos zu erweitern oder jeden Befehl mit sudo zu versehen.
Sensibler Protokollinhalt
Authentifizierungstoken, Sitzungs-IDs und persönliche Informationen können in Protokollen enthalten sein. Stellen Sie sicher, dass sensible Werte nicht in Bildschirmfreigaben, Terminalhistorien oder kopierten Fehlermeldungen offengelegt werden. Beim externen Teilen von Betriebsprotokollen extrahieren Sie nur den notwendigen Umfang und anonymisieren Sie sensible Werte.
Häufig gestellte Fragen
Wie viele Zeilen zeigt tail standardmäßig an?
Wenn keine Option angegeben wird, werden die letzten 10 Zeilen angezeigt. Wenn Sie eine andere Anzahl benötigen, können Sie die Anzahl der Zeilen nach -n angeben, zum Beispiel tail -n 30 filename.
Wie stoppe ich tail -f?
Drücken Sie Ctrl+C, um die laufende Nachverfolgung zu stoppen und zur Shell-Eingabeaufforderung zurückzukehren. Diese Aktion löscht oder verändert die Protokolldatei nicht.
Warum sehe ich nach der Protokollrotation keinen neuen Inhalt?
Es kann daran liegen, dass -f weiterhin den Deskriptor der Datei verfolgt, bevor sie ersetzt wurde. Versuchen Sie, GNU tail -F filename zu verwenden, um die neue Datei basierend auf dem Dateinamen erneut zu öffnen. Wenn sie immer noch nicht angezeigt wird, müssen Sie den tatsächlichen Protokollpfad und die Ausgabeeinstellungen des Dienstes überprüfen.
Kann tail auf komprimierten Protokolldateien verwendet werden?
tail dekomprimiert komprimierte Formate nicht automatisch. Sie können die gesamte komprimierte Datei dekomprimieren und durch eine Pipe weiterleiten, aber dies kann bei großen Dateien ineffizient sein. Zum Beispiel kann eine gzip-Datei mit zcat archive.log.gz | tail -n 50 überprüft werden.
Zusammenfassung
Um schnell den aktuellen Inhalt zu überprüfen, verwenden Sie tail filename, und um die Anzahl der Zeilen anzugeben, verwenden Sie tail -n N filename. Um neue Protokolle kontinuierlich anzuzeigen, verwenden Sie -f, und wenn die Datei aufgrund der Protokollrotation ersetzt wird, wird empfohlen, -F von GNU tail zu verwenden.
Indem Sie sich mit grep verbinden, können Sie nur die notwendigen Nachrichten filtern, sollten jedoch vorsichtig mit Berechtigungen und der Offenlegung sensibler Informationen sein. Wenn Sie auch andere grundlegende Werkzeuge kennenlernen möchten, können Sie Liste der häufig verwendeten Befehle in Linux einsehen.




