Antworten:
Versuche dies:
truncate -s 0 /var/log/*log
BEARBEITEN:
Wenn Sie dies mehrmals tun möchten, sollten logrotate
Sie 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.
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 .gz
Protokolle 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 logrotate
dafür.
Als Antwort auf @DEN folgen
Dadurch werden alle Protokolldateien in gefunden /var/log
und auf 0 Byte gekürzt.
find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0
*.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-20180930
und gibt dovecot.log-20180923.gz
.
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.txt
oder : > file.txt
(und bei bash
Shell 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_TRUNC
Flags 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.c
und 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 .log
Dateien finden Sie bereits in anderen Antworten - verwenden Sie *
glob oder extended glob in bash
. Es gibt auch find -type f -name "*.log"
, welches -exec
Befehle 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/log
oft von logrotate Service gedreht werden, so wird es Dateinamen sein wie /var/log/service.log
, /var/log/service.log.1
etc, so dass Sie verwenden möchten , können *.log.[1-9]
stattdessen Muster
Unter anderem können wir /dev/null
in die gewünschte Datei kopieren . Seltsamerweise, auch wenn /dev/null
es 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:
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
for logfile in /path/*.log
stattdessen.
/var/log
hier werden Nachrichten abgelegt, die Sie möglicherweise später benötigen. Ubuntu hat das Problem schon einmal angetroffen. Lesenman 8 logrotate;man logrotate.conf
.