Wie schneide ich alle Logdateien ab?

17

Kann mir jemand eine Lösung geben, um alle Protokolldateien im /var/log/Verzeichnis abzuschneiden ?

und eine Frage nur für Wissen, ist es eine gute Idee oder nicht?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done
Pylover
quelle
1
Es ist keine gute Idee - /var/loghier werden Nachrichten abgelegt, die Sie möglicherweise später benötigen. Ubuntu hat das Problem schon einmal angetroffen. Lesen man 8 logrotate;man logrotate.conf.
Waltinator

Antworten:

34

Versuche dies:

truncate -s 0 /var/log/*log

BEARBEITEN:

Wenn Sie dies mehrmals tun möchten, sollten logrotateSie die Protokolle bearbeiten. Normalerweise ist es in Ubuntu installiert. Schauen Sie sich das an man logrotate(oder wenn Sie es nicht installiert haben, schauen Sie sich die Online-Manpage an oder installieren Sie es mit sudo apt-get install logrotate)

von der manpage:

logrotate wurde entwickelt, um die Verwaltung von Systemen zu vereinfachen, die eine große Anzahl von Protokolldateien generieren. Es ermöglicht das automatische Drehen, Komprimieren, Entfernen und Versenden von Protokolldateien. Jede Protokolldatei kann täglich, wöchentlich, monatlich oder wenn sie zu groß wird, verarbeitet werden.

DEN
quelle
Sie können sie auch mit echo ""> * log
Astm
10

Wenn Sie alle Ihre Protokolldateien löschen möchten , nicht nur die im Protokollordner der ersten Ebene, können Sie Folgendes verwenden:

shopt -s globstar                  # if needed
truncate -s 0 /var/log/*.log       # first-level logs
truncate -s 0 /var/log/**/*.log    # nested folders, like /var/log/nginx/access.log

Wenn Sie bereits ausgeführt haben logrotate, müssen Sie auch die gedrehten .gzProtokolle löschen :

find /var/log -type f -name '*.[0-99].gz' -exec rm {} +

Eine gültige Verwendung hierfür könnte beispielsweise das Erstellen eines VM-Appliance-Containers für die Verteilung sein.

Sie sollen nicht diese als Teil der Routinewartung tun müssen , um: als DIE ganz richtig vorgeschlagen, Verwendung logrotatedafür.

msanford
quelle
1

Als Antwort auf @DEN folgen

Dadurch werden alle Protokolldateien in gefunden /var/logund auf 0 Byte gekürzt.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
Luka
quelle
1
Ich würde *.log*stattdessen verwenden, bin mir aber nicht sicher, ob es 100% sicher ist. Daher habe ich es nicht in die Antwort aufgenommen. Weil es Dateien wie dovecot.log-20180930und gibt dovecot.log-20180923.gz.
Luka
0

Es gibt einige Methoden zum vollständigen Abschneiden einer Datei, die im Allgemeinen auf die meisten POSIX-kompatiblen Betriebssysteme anwendbar sind. Am häufigsten wird bei Shell-Skripten Folgendes festgestellt: true > file.txtoder : > file.txt(und bei bashShell ist die >Umleitung allein ausreichend). Dies liegt an der Art und Weise, wie >Dateien über open()oder openat()syscall mit O_WRONLY|O_CREAT|O_TRUNCFlags geöffnet werden - das heißt, schreibgeschützt ODER erstellt, wenn der Dateiname nicht vorhanden ist, ODER schneidet den vorhandenen Dateinamen ab.

In diesem Sinne können wir so etwas in C selbst implementieren:

#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char **argv){
    if (argc == 2){
        int fd = open(argv[1],O_TRUNC);
        close(fd);
    }

    return 0;
}

Nennen Sie die Datei, in der dieser Code gespeichert ist, trunc.cund kompilieren Sie ihn mit gcc trunc.c -o trunc. Sie haben ein kleines Dienstprogramm, das ein Dateinamenargument abschneidet, wie es in bereitgestellt wird trunc ./foobar.txt. Natürlich führt dieser Code keine weiteren Überprüfungen durch, sondern schneidet nur den ersten Positionsparameter ab. Ich überlasse es den Lesern, herauszufinden, wie mit mehr als einem Positionsparameter umzugehen ist. truncate()Nebenbei bemerkt gibt es Syscall, den wir auch verwenden und eine Datei auf eine variable Länge kürzen könnten.

Wenn Sie kein C-Fan sind, könnte Python für Sie einfacher sein. open()Der Befehl funktioniert in Python nach demselben Prinzip: Öffnen einer Datei zum Schreiben und Abschneiden, wenn ein Dateiname vorhanden ist. So können wir es tun

python -c 'import sys;open(sys.argv[1],"w").close()' passwd.copy 

Informationen zum Auffinden aller .logDateien finden Sie bereits in anderen Antworten - verwenden Sie *glob oder extended glob in bash. Es gibt auch find -type f -name "*.log", welches -execBefehle zum Ausführen - Flag (in diesem speziellen Fall sh -c ''zu nutzen , >weil >ein Bediener Schal und keine externe ausführbare). So können Sie tun

find /var/log -type f -name "*.log" -exec sh -c 'true > "$1"' sh {} \;

Es ist auch erwähnenswert , dass Log - Dateien im Verzeichnis der Feststellung , wie /var/logoft von logrotate Service gedreht werden, so wird es Dateinamen sein wie /var/log/service.log, /var/log/service.log.1etc, so dass Sie verwenden möchten , können *.log.[1-9]stattdessen Muster


Unter anderem können wir /dev/nullin die gewünschte Datei kopieren . Seltsamerweise, auch wenn /dev/nulles sich um eine Gerätedatei mit Sonderzeichen handelt, ist das Ergebnis beim Kopieren, zumindest mit GNU, eine leere reguläre Datei cp. So können wir es tun

cp /dev/null foo.txt

oder

dd if=/dev/null of=foo.txt

Andere Lesevorschläge:

Sergiy Kolodyazhnyy
quelle
0

Es wird empfohlen, die Protokolle in / var / logs zu drehen, um sie mit der Logrotate-Funktionalität zu drehen, jedoch nicht, wann immer wir dies möchten. Systemprotokolle werden gedruckt und sind praktisch, um etwaige Fehler zu beheben.

Wenn die Verwendung von Logrotate nicht erforderlich ist, können Optionen untersucht werden. Obwohl das Abschneiden in einigen Unix-Versionen eine einfache Option ist, ist dieser Befehl nicht sofort verfügbar. Er muss installiert werden. Wenn der neue Befehl nicht installiert werden darf, kann die folgende Schleife verwendet werden.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done
Devoloper250
quelle
Bash Pitfall # 1 : Schreiben Sie auf diese Weise nicht für Schleifen. Verwenden Sie for logfile in /path/*.logstattdessen.
PerlDuck