Frage Gibt es eine ordnungsgemäße Möglichkeit, Protokolle zu löschen?


Ich habe mich gefragt, ob es überhaupt eine vernünftige Art gibt, Stämme zu löschen.

Ich bin neu bei Ubuntu und versuche Postfix einzurichten. Das Logbuch ist /var/log/mail.log. Ich habe mich gefragt, ob es einen richtigen Weg gibt, um es zu löschen, anstatt dass ich darin rein gehe und alle Zeilen lösche und es speichere. Ich stelle fest, dass manchmal Fehler nicht sofort geschrieben werden, nachdem ich das Protokoll gelöscht und gespeichert habe.

Randnotiz: Ich habe Probleme beim Einrichten von Postfix und versuche, die Logs leichter zu lesen, in der Hoffnung, dass es mir helfen kann, anstatt den ganzen Weg runterscrollen zu müssen.


54
2018-06-30 16:13


Ursprung


Wenn Sie nur das Ende der Datei sehen möchten, dann Schwanz ist dein Freund. tail /var/log/mail.log, um die letzten 5 Zeilen anzuzeigen. tail -f /var/log/mail.log, um alle am Ende der Datei geschriebenen Zeilen zu sehen. - Iain
serverfault.com/questions/285843/... - poige


Antworten:


Sie können verwenden:

> /var/log/mail.log

Dadurch wird das Protokoll abgeschnitten, ohne dass Sie die Datei bearbeiten müssen. Es ist auch eine zuverlässige Möglichkeit, den Raum zurück zu bekommen. Manchmal machen Leute den Fehler, rm auf dem Protokoll zu verwenden und dann den Dateinamen neu zu erstellen, wenn ein anderer Prozess die Datei geöffnet hat, dann bekommst du den Speicherplatz nicht zurück, bis dieser Prozess ihn schließt und du seine Berechtigungen durcheinander bringen kannst.

Wenn Sie sich den Inhalt des Logs ansehen, können Sie den tail Befehl:

tail -f /var/log/mail.log

Strg-C bricht den Tailing ab.


67
2018-06-30 16:20



/bin/csh (üblich für FreeBSD) würde dies mit "Invalid null command", inzwischen zsh (beliebter Ersatz für bash) würde EOF warten. Sehen serverfault.com/a/381380/67675 - poige


Ja, es gibt einen richtigen Weg: Sie nicht klar Protokolle überhaupt. Sie drehen Sie. Bei der Rotation wird die Protokollausgabe unter dem gleichen Namen auf eine neue Datei umgestellt, wobei die vorherigen N Protokolldateien unter einer Reihe von N zugehörigen Dateinamen gehalten werden.

Wie man Logs dreht, hängt davon ab, wie man sie zuerst schreibt.  Dies ist ein oft übersehener Punkt. Einige der Antworten hier berühren es zumindest und erwähnen, dass einige Protokollierungsprogramme einen offenen Dateideskriptor für die Protokolldatei behalten, so dass das Löschen der Datei den Speicherplatz nicht freigibt oder sogar die Ausgabe in eine neue Protokolldatei umschaltet.

Wenn das Programm die Protokolldatei schreibt multilog von dem daemontools PaketZum Beispiel, dann machst du nichts, um die Logs zu rotieren - keine manuellen Skripte, nein cron Arbeitsplätze. Sag es einfach multilog Diese Protokollausgabe erfolgt in einem Verzeichnis, und es verwaltet selbst eine automatisch gedrehte und größenbegrenzte Gruppe von N Protokolldateien in diesem Verzeichnis.

Wenn das Programm die Protokolldateien schreibt svlogd von dem runit PaketFür ein anderes Beispiel gilt das Gleiche. Sie tun nichts, außer das Werkzeug in einem Verzeichnis zu zeigen. Es wird selbst einen automatisch gedrehten und größenbegrenzten Satz von N Protokolldateien in diesem Verzeichnis beibehalten.

Wenn Sie verwenden rsyslog um dann Protokolldateien zu schreiben Das Protokollierungsprogramm kann angehalten werden, nachdem die Protokolldatei eine bestimmte Größe erreicht hat, und ein Skript ausführen. Sie müssen den Inhalt des Skripts schreiben, um die Protokolldatei tatsächlich umzubenennen und alte Protokolldateien basierend auf den Beschränkungen der Gesamtgröße zu löschen, aber zumindest hat das Protokollierungsprogramm die Datei geschlossen und die Protokollierung unterbrochen, während dies geschieht.

Das alte syslogd Art rotierende Stämme, wird immer noch von Logging-Programmen wie syslog-ng erwartet und wie durch Werkzeuge wie veranschaulicht logrotateerwähnt von djangofan in einer anderen Antwort hier ist etwas mehr zufällig. Man läuft a cron Job, der die Protokolldateien in regelmäßigen Abständen umbenennt und den Protokollierungsdämon neu startet (unter Verwendung des Daemon-Supervisors, unter dem er ausgeführt wird). Das Problem dabei ist natürlich, dass es keine globale Größenbeschränkung durchsetzt. Auf langsamen Wochen kann man N sehr kleine tägliche Log-Dateien bekommen, während man an hektischen Tagen eine sehr große Log-Datei bekommt, die weit über der Größenbeschränkung liegt.

Deshalb später und bessere Werkzeuge wie multilog und svlogd Konfigurationsoptionen für die Dateigröße haben und natürlich die Größe der Protokolldateien überprüfen. Die Welt hat gelernt, dass die Protokolle nach einem Zeitplan abfragen cron Jobs oder sogar a logrotate Daemon, lässt Fenster für die Größe falsch sein, und dass der richtige Ort, um diese Prüfungen zu haben, und so streng Erzwingen Sie Administrator-definierte Größenbeschränkungen, so dass die Protokolldateien nicht die Partition verschlucken, auf der sie sich befinden, sondern sich in dem Programm befinden, das die Dateien tatsächlich an erster Stelle schreibt.


21
2017-07-01 10:58



Was rsyslog angeht, kann es leicht so konfiguriert werden, dass es sich auf Dateinamen stützt, die durch ein "Muster" beschrieben werden, einschließlich beispielsweise YEAR, MONTH und DAY. Das ist so einfach wie ein template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log") Richtlinie, gefolgt von a if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. Auf diese Weise ist die Log-Rotation einfach kein Problem, zumindest wenn eine einzelne Datei pro Tag in Ordnung ist. Für sehr große Log-Volumina (die mehrere Drehungen pro Tag benötigen) gibt es $HOUR auch. - Damiano Verzulli


Ja, es gibt ein Tool für Linux angerufen LogRotate .


10
2018-06-30 16:36



Nur eine kleine Korrektur: Das ist kein Service, das ist ein Tool, das normalerweise von cron service läuft. - rvs


Wenn der Grund für das Löschen des Protokolls der freie Speicherplatz ist, können Sie cat / dev / null verwenden, ohne die Programme zu unterbrechen. Lösche sie nie! Manche Software könnte sich beschweren, wenn sie nicht mehr funktioniert oder das Protokoll bis zum nächsten Neustart ignoriert

cat /dev/null > /path/to/logfile

# to empty all the logs in a directory
for i in /var/log/*; do cat /dev/null > $i; done

8
2018-04-20 00:55



Log-Dateien rekursiv löschen: for i in $(find /var/log -type f); do cat /dev/null > $i; done - Iurie Malai


Du kannst das auch benutzen ..

truncate /opt/package/logs/*.log --size 0

Hier werden alle Log-Dateien im Verzeichnis / opt / package / logs leer.


4
2018-06-25 05:32



Ich sehe nicht, wie das besser sein könnte als die älteren Antworten. - kasperd
Dies ist eigentlich eine sehr gute Antwort, und wirklich die einzige, die direkt die Frage beantwortet, ob es eine richtige Möglichkeit gibt, Logfiles zu kürzen. WIE es besser ist als die anderen Antworten ist, dass das Logfile NICHT LÖSCHT, es den Inhalt richtig zerlegt, so dass Berechtigungsfehler und fehlende Logdateien, die dazu führen, dass einige Daemons in Panik geraten, in diesem Fall nicht auftreten. - hmedia1


Kurzes und kompatibles Überschreiben von Inhalten: : > /dest/file

Aber es gibt auch den Systemaufruf truncate (2) und das entsprechende Userspace-Tool truncate auf vielen * NIX'es.


3
2018-04-20 01:25





Wenn Sie die Datei behalten möchten, bevor Sie sie bereinigen, können Sie Folgendes tun:

cp /var/log/mail.log /var/log/mail.log.1 && echo -n "" > /var/log/mail.log

Wenn Sie nach einem bestimmten Text oder einer E-Mail im Protokoll suchen möchten, können Sie grep verwenden. Wenn Sie einige Grafiken über die Mail-Nutzung behalten möchten, können Sie AWStats verwenden.


0
2018-06-30 16:25





cat / dev / null> / pfad / zu / logdatei

Funktioniert bei mir


0
2017-11-22 02:21





Hier ist, wie ich es mache, und das ist nur für NGINX, können Sie das entfernen, damit es in allen Protokolldateien funktioniert.

# Clear nginx logs.
# @usage delnginxlogs
function delnginxlogs() {
  echo "---------------   Clearing logs... ---------------"

  # Clear logs.
  for i in /var/log/nginx/*; do cat /dev/null > $i; done

  echo "---------------   Deleting .gz log files... ---------------"

  # Delete .gz files.
  find /var/log/nginx -type f -regex ".*\.gz$" -delete

  echo "---------------  DONE: NGINX logs cleared ... ---------------"
}

0
2018-03-25 00:28