Come troncare tutti i file di registro?


18

qualcuno può darmi una soluzione per troncare tutti i file di registro nella /var/log/directory?

e una domanda solo per conoscenza, è una buona idea o no?

#!/bin/bash
LOGDIR="/var/log"
for logfile in $(ls $LOGDIR/*log)
do
  truncate -s 0 $logfile
done

1
NON è una buona idea - /var/logè dove il sistema inserisce i messaggi che potrebbero essere necessari in seguito. Ubuntu ha riscontrato il problema in precedenza. Leggi man 8 logrotate;man logrotate.conf.
Waltinator,

Risposte:


34

prova questo:

truncate -s 0 /var/log/*log

MODIFICARE:

se vuoi farlo più di una volta dovresti usare logrotateper gestire i tuoi log. Di solito è installato in Ubuntu. Dai un'occhiata man logrotate(o se non lo hai installato guarda la manpage online o installalo con sudo apt-get install logrotate)

dalla manpage:

logrotate è progettato per facilitare l'amministrazione di sistemi che generano un numero elevato di file di registro. Consente la rotazione, la compressione, la rimozione e l'invio automatici dei file di registro. Ogni file di registro può essere gestito giornalmente, settimanalmente, mensilmente o quando diventa troppo grande.


inoltre puoi svuotarli usando echo ""> * log
Astm

10

Se si desidera cancellare tutti i file di registro, non solo quelli nella cartella di registro di primo livello, è possibile utilizzare:

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

Notando che se hai già in logrotateesecuzione, dovrai cancellare anche i .gzregistri ruotati :

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

Un uso valido per questo potrebbe essere la creazione di un contenitore di appliance VM per la distribuzione, ad esempio.

Non dovresti aver bisogno di farlo come parte della manutenzione ordinaria: come DEM ha suggerito correttamente, usalo logrotateper quello.


1

Come seguito alla risposta @DEN

Questo troverà tutti i file di registro /var/loge li troncerà a 0 byte.

find /var/log -type f -iname '*.log' -print0 | xargs -0 truncate -s0

1
Vorrei *.log*invece utilizzare, ma non sono sicuro che sia sicuro al 100%, quindi non l'ho incluso nella risposta. Perché ci sono file come dovecot.log-20180930e dovecot.log-20180923.gz.
Luka,

0

Esistono due metodi per troncare completamente un file, generalmente applicabile alla maggior parte dei sistemi operativi compatibili con POSIX. Il più comune che vedrai con gli script di shell è qualcosa di simile true > file.txto : > file.txt(e in caso di bashshell, il >reindirizzamento da solo è sufficiente). Ciò è dovuto al modo in cui >apre i file tramite open()o openat()syscall con O_WRONLY|O_CREAT|O_TRUNCflag - che legge la sola scrittura o crea se il nome file non esiste, o tronca il nome file esistente.

Con questo in mente, possiamo implementare qualcosa del genere in C noi stessi:

#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;
}

Denominare il file in cui è memorizzato questo codice trunc.ce compilarlo con gcc trunc.c -o trunc, e si avrà una piccola utility che troncerà un argomento del nome file fornito come in trunc ./foobar.txt. Naturalmente, questo codice non esegue altri controlli, ma tronca solo il primo parametro posizionale. Lascerò ai lettori capire come gestire più di un parametro posizionale. Sulla nota a truncate()margine , c'è anche syscall che potremmo usare e troncare un file a lunghezza variabile.

Ora, se non sei un fan di C, Python potrebbe essere più facile per te. open()Il comando opera sullo stesso principio in Python: apertura del file per la scrittura e il troncamento se esiste un nome file. Così possiamo fare

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

Per quanto riguarda la ricerca di tutti i .logfile, è già stato trattato in altre risposte - usa *glob o extended glob in bash. C'è anche find -type f -name "*.log", che ha -execflag per l'esecuzione di comandi (in questo caso particolare sh -c ''da sfruttare >perché >è un operatore shell e non un eseguibile esterno). Così puoi fare

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

E 'anche interessante notare che i file di log nella directory come /var/logspesso vengono fatti ruotare dal servizio logrotate, quindi ci saranno nomi di file come ad esempio /var/log/service.log, /var/log/service.log.1, ecc, quindi si consiglia di utilizzare *.log.[1-9]motivo invece


Tra le altre cose, possiamo copiare /dev/nullnel file desiderato. Stranamente, anche se /dev/nullè un tipo di file con dispositivo a caratteri speciali, quando lo copi altrove il risultato è un file normale vuoto, almeno con GNU cp. Così possiamo fare

cp /dev/null foo.txt

o

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

Altre letture consigliate:


0

È buona norma ruotare i log in / var / logs per ruotare con la funzionalità logrotate ma non ogni volta che lo desideriamo. I log di sistema verranno stampati e saranno utili per eseguire il debug di eventuali errori.

Se è necessario non utilizzare logrotate, è possibile esplorare le opzioni. Sebbene troncare sia un'opzione semplice in alcune versioni del sistema unix, questo comando non è disponibile prontamente, deve essere installato. Se non è consentito installare il nuovo comando, è possibile utilizzare il ciclo sottostante.

for logfile $(ls /path/*.log)
do 
  cat /dev/null > $logfile
done

Bash Pitfall # 1 : non scrivere per i loop in quel modo. Usa for logfile in /path/*.loginvece.
PerlDuck,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.