Gibt es eine richtige Möglichkeit zum Löschen von Protokollen?


65

Ich habe mich gefragt, ob es einen richtigen Weg gibt, um Protokolle im Allgemeinen zu löschen.

Ich bin neu in Ubuntu und versuche, Postfix einzurichten. Das fragliche Login ist /var/log/mail.log. Ich habe mich gefragt, ob es einen richtigen Weg gibt, es zu löschen, anstatt dass ich alle Zeilen lösche und speichere. Ich finde, 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, das Lesen der Protokolle zu vereinfachen, in der Hoffnung, dass es mir helfen kann, anstatt einen Bildlauf bis zum Ende durchzuführen.


2
Wenn du nur das Ende der Datei sehen willst, dann ist tail dein Freund. Stellen Sie mit /var/log/mail.log sicher, dass die letzten 5 Zeilen angezeigt werden. Tail -f /var/log/mail.log, um alle Zeilen zu sehen, die an das Ende der Datei geschrieben sind.
user9517

Antworten:


79

Sie können verwenden:

> /var/log/mail.log

Dadurch wird das Protokoll abgeschnitten, ohne dass Sie die Datei bearbeiten müssen. Es ist auch ein zuverlässiger Weg, um den Platz zurückzugewinnen. Manchmal machen die Leute den Fehler, rm im Protokoll zu verwenden und dann den Dateinamen neu zu erstellen. Wenn bei einem anderen Prozess die Datei geöffnet ist, erhalten Sie den Speicherplatz erst zurück, wenn dieser Prozess seine Zugriffsrechte schließt und Sie seine Berechtigungen durcheinander bringen können.

Wenn Sie sich den Inhalt des Protokolls ansehen, können Sie auch den folgenden tailBefehl verwenden:

tail -f /var/log/mail.log

Strg-C bricht das Tailing ab.


2
/bin/csh(gebräuchlich für FreeBSD) würde dies mit "Invalid null command" zshbeheben, während (populärer Ersatz für bash) auf EOF warten würde. Siehe serverfault.com/a/381380/67675
poige

Wie kann ich das planen? Das Einfügen von >Syntax in crontab wird nicht ausgeführt, da es möglicherweise nicht als Syntax erkannt wird
ishandutta2007

26

Ja, es gibt einen richtigen Weg: Sie löschen überhaupt keine Protokolle. Sie drehen sie. Bei der Rotation wird die Protokollausgabe auf eine neue Datei mit demselben Namen umgeschaltet, wobei die vorherigen N Protokolldateien unter einem Satz von N verwandten Dateinamen gespeichert werden.

Wie man Protokolle dreht, hängt davon ab, wie man sie zuerst schreibt. Dies ist ein oft übersehener Punkt. Einige der hier gegebenen Antworten beziehen sich zumindest darauf und erwähnen, dass einige Protokollierungsprogramme einen offenen Dateideskriptor für die Protokolldatei beibehalten, sodass nur das Löschen der Datei nicht den Speicherplatz freigibt oder sogar die Ausgabe auf eine neue Protokolldatei umschaltet.

Wenn das Programm, mit dem die Protokolldatei geschrieben wird , zum Beispiel multilogaus dem daemontoolsPaket stammt , tun Sie nichts, um die Protokolle überhaupt zu drehen - keine manuellen Skripte, keine cronJobs. Sagen Sie einfach, multilogdass sich die Protokollausgabe in einem Verzeichnis befindet, und es wird selbst eine automatisch gedrehte und größenbegrenzte Menge von N Protokolldateien in diesem Verzeichnis beibehalten.

Wenn das Programm, mit dem die Protokolldateien geschrieben werden, beispielsweise svlogdaus dem runitPaket stammt , gilt das Gleiche. Sie tun nichts anderes, als das Tool auf ein Verzeichnis zu richten. Es verwaltet selbst einen automatisch gedrehten und größenbegrenzten Satz von N Protokolldateien in diesem Verzeichnis.

Wenn Sie rsyslogzum Schreiben von Protokolldateien verwenden, kann das Protokollierungsprogramm angewiesen werden, anzuhalten, nachdem die Protokolldatei eine bestimmte Größe erreicht hat, und ein Skript auszuführen . Sie müssen das Fleisch des Skripts schreiben, um die Protokolldatei tatsächlich umzubenennen und alte Protokolldateien basierend auf Gesamtgrößenbeschränkungen zu löschen, aber zumindest hat das Protokollierungsprogramm die Datei geschlossen und das Schreiben von Protokollen angehalten, während dies geschieht.

Die alte syslogdMethode zum Rotieren von Protokollen, die immer noch von Protokollierungsprogrammen wie syslog-ng erwartet wird und anhand von Tools veranschaulicht wird, wie logrotatesie djangofanin einer anderen Antwort erwähnt wurden, ist etwas willkürlicher. Einer führt einen cronJob aus, der die Protokolldateien regelmäßig umbenennt und den Protokollierungsdämon neu startet (mit dem Dämon-Supervisor, unter dem er ausgeführt wird). Das Problem dabei ist natürlich, dass keine Obergrenze für die Gesamtgröße festgelegt wird. In langsamen Wochen können N sehr kleine tägliche Protokolldateien abgerufen werden, während an geschäftigen Tagen 1 sehr große Protokolldatei abgerufen werden kann, die weit über der Größenbeschränkung liegt.

Aus diesem Grund mögen multilogund svlogdhaben spätere und bessere Tools Konfigurationsoptionen für die Dateigröße und prüfen die Protokolldateigrößen natürlich selbst. Die Welt hat erfahren, dass das Abrufen der Protokolle nach einem Zeitplan mit cronAufträgen oder sogar einem logrotateDaemon Fenster für die falsche Größe und den richtigen Ort für diese Überprüfungen belässt und die vom Administrator festgelegten Größenbeschränkungen so rigoros erzwingt , dass sie eingehalten werden Protokolldateien verschlucken niemals die Partition, auf der sie sich befinden, und befinden sich in dem Programm, das die Dateien tatsächlich an erster Stelle ausschreibt.


Was rsyslog betrifft, kann es einfach so konfiguriert werden, dass es sich auf Dateinamen stützt, die durch ein "Muster" beschrieben werden, einschließlich beispielsweise YEAR, MONTH und DAY. Dies ist so einfach wie eine template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")Direktive, gefolgt von einem if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. Auf diese Weise ist die Protokollrotation einfach kein Problem, zumindest wenn eine einzelne Datei pro Tag in Ordnung ist. Für sehr große Holzmengen (die mehrere Rotationen pro Tag erfordern) gilt dies $HOURebenfalls.
Damiano Verzulli

13

Sie können dies auch verwenden ..

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

Hier werden alle Protokolldateien in / opt / package / logs leer.


Ich sehe nicht, wie das besser sein könnte als die älteren Antworten.
Kasperd

4
Dies ist tatsächlich eine sehr gute Antwort und die einzige, die direkt die Frage beantwortet, ob es eine richtige Möglichkeit gibt, Protokolldateien zu kürzen. WIE es besser ist als die anderen Antworten, die Protokolldatei nicht zu LÖSCHEN, sondern den Inhalt ordnungsgemäß auf Null zu setzen. In diesem Fall treten keine Berechtigungsfehler und fehlenden Protokolldateien auf, die dazu führen, dass einige Daemons in Panik geraten.
hmedia1

11

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


9
Nur eine kleine Korrektur: Dies ist kein Service, sondern ein Tool, das normalerweise vom Cron-Service ausgeführt wird.
rvs

10

Wenn Sie das Protokoll löschen, um Speicherplatz freizugeben, können Sie cat / dev / null verwenden, ohne Programme zu unterbrechen, die in das Protokoll schreiben. Lösche sie niemals! Manche Software beschwert sich möglicherweise, indem sie aufhört zu arbeiten oder das Protokoll bis zum nächsten Neustart vollständig 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

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

4

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

Es gibt aber auch einen Systemaufruf truncatevom Typ truncate (2) und ein entsprechendes Userspace-Tool auf vielen * NIX-Systemen.


1

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 bestimmten E-Mail im Protokoll suchen möchten, können Sie grep verwenden. Wenn Sie einige Grafiken zur Mailnutzung behalten möchten, können Sie AWStats verwenden.


1

Hier ist, wie ich es mache, und dies ist nur für NGINX, Sie können das entfernen, damit es auf 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 ... ---------------"
}

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.