Esiste un modo corretto per cancellare i registri?


65

Mi chiedevo se esistesse un modo corretto per cancellare i registri in generale?

Sono nuovo di Ubuntu e sto provando a configurare Postfix. La domanda di accesso è /var/log/mail.log. Mi chiedevo se ci fosse un modo corretto per cancellarlo, piuttosto che me che ci entravo e cancellavo tutte le linee e lo salvavo. Trovo che a volte gli errori non vengano scritti immediatamente dopo aver cancellato il registro e averlo salvato.

Nota a margine: sto riscontrando problemi con l'installazione di Postfix e sto cercando di semplificarmi la lettura dei registri sperando che mi possa aiutare, invece di dover scorrere fino in fondo.


2
se vuoi vedere solo la fine del file, tail è tuo amico. tail /var/log/mail.log per visualizzare le ultime 5 righe. tail -f /var/log/mail.log per vedere tutte le righe scritte alla fine del file.
user9517 supporta GoFundMonica il

Risposte:


79

Puoi usare:

> /var/log/mail.log

Ciò troncherà il registro senza che tu debba modificare il file. È anche un modo affidabile per recuperare lo spazio. A volte le persone commettono l'errore di usare rm nel registro e ricreare il nome file, se un altro processo ha il file aperto, non si ottiene lo spazio fino a quando quel processo non chiude il suo handle e si possono incasinare le sue autorizzazioni.

Inoltre, se stai guardando il contenuto del registro, potresti utilizzare il tailcomando:

tail -f /var/log/mail.log

Ctrl-C interromperà la coda.


2
/bin/csh(comune per FreeBSD) lo avrebbe salvato con "comando null non valido", nel frattempo zsh(sostituzione popolare per bash) avrebbe atteso EOF. Vedi serverfault.com/a/381380/67675
poige

come posso programmarlo? mettere la >sintassi in crontab non è in esecuzione in quanto potrebbe non riconoscerla come sintassi
ishandutta2007

26

Sì, esiste un modo corretto: non cancelli affatto i registri. Li ruoti . La rotazione comporta il passaggio dell'output del registro in un nuovo file, con lo stesso nome, con i precedenti file di registro N conservati in un set di N nomi di file correlati.

Il modo in cui uno ruota i registri dipende da come li sta scrivendo in primo luogo. Questo è un punto spesso trascurato. Alcune delle risposte qui lo toccano almeno, menzionando che alcuni programmi di registrazione mantengono un descrittore di file aperto per il file di registro, quindi solo l'eliminazione del file non libererà lo spazio, o addirittura cambierà l'output in un nuovo file di registro.

Se il programma che scrive il file di registro multilogproviene dal daemontoolspacchetto , ad esempio, allora non si fa nulla per ruotare i registri: niente script manuali, niente cronlavori. È sufficiente dire multilogche l'output del registro è indirizzato a una directory e manterrà esso stesso un set di N file con rotazione automatica e con limiti di dimensione in quella directory.

Se il programma che scrive i file di registro svlogdproviene dal runitpacchetto , per un altro esempio, vale lo stesso. Non devi fare nulla a parte puntare lo strumento in una directory. Manterrà esso stesso un insieme ruotato automaticamente e con dimensioni limitate di N file di registro in quella directory.

Se si utilizza rsyslogper scrivere i file di registro, è possibile che il programma di registrazione venga arrestato dopo che il file di registro raggiunge una determinata dimensione ed esegue uno script . Devi scrivere il contenuto dello script, in realtà rinominare il file di registro ed eliminare i vecchi file di registro in base a vincoli di dimensione totale, ma almeno il programma di registrazione ha chiuso il file e messo in pausa la scrittura del registro mentre ciò accade.

Il vecchio syslogdmodo di ruotare i registri, ancora previsto dai programmi di registrazione come syslog-ng ed esemplificato da strumenti come logrotatemenzionato djangofanin un'altra risposta qui, è in qualche modo più casuale. Uno esegue un cronlavoro che rinomina periodicamente i file di registro e riavvia il demone di registrazione (usando qualunque supervisore di daemon in cui è in esecuzione). Il problema con questo, ovviamente, è che non impone un limite di dimensioni complessive. Nelle settimane lente è possibile ottenere N file di registro giornalieri molto piccoli, mentre nei giorni di grande affluenza è possibile ottenere 1 file di registro molto grande che supera di molto il limite di dimensioni.

Questo è il motivo per cui strumenti successivi e migliori come multiloge svlogdhanno opzioni di configurazione delle dimensioni dei file e, ovviamente, controllano le dimensioni dei file di registro. Il mondo ha appreso che il polling dei registri in base a una pianificazione con cronlavori, o persino un logrotatedemone, lascia a Windows la dimensione errata delle dimensioni e che il posto giusto per avere questi controlli, e applicare così rigorosamente i limiti di dimensione definiti dall'amministratore in modo che i file di registro non inghiottono mai la partizione in cui si trovano, è nel programma che sta scrivendo i file in primo luogo.


Per quanto riguarda rsyslog, può essere facilmente configurato in modo da fare affidamento sui nomi di file descritti da un "modello" che include, ad esempio, ANNO, MESE e GIORNO. È facile come avere una template(name="DYNmail" type="string" string="/var/log/%$YEAR%/%$MONTH%/%$DAY%/mail.log")direttiva, seguita da a if ($syslogfacility-text == 'mail') then -?DYNmail;TraditionalFormat. In questo modo, la rotazione del registro è semplicemente un problema, almeno quando un singolo file al giorno è ok. Per volumi molto elevati di log (che richiedono più rotazioni al giorno), esiste $HOURanche.
Damiano Verzulli,

13

Puoi usare anche questo ..

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

Qui tutti i file di registro in / opt / pacchetto / logs diventeranno vuoti ..


Non vedo come questo potrebbe essere migliore delle risposte più vecchie.
Kasperd,

4
Questa è in realtà una risposta molto buona, e davvero l'unica che risponde direttamente alla domanda se c'è un modo corretto di troncare i file di registro. COME è meglio delle altre risposte è che NON ELIMINA il file di registro, azzera i contenuti correttamente, quindi in questo caso non si verificheranno errori di autorizzazione e file di registro mancanti che causano il panico di alcuni demoni.
hmedia1,

11

Sì, esiste uno strumento per Linux chiamato LogRotate .


9
Solo una piccola correzione: questo non è un servizio, questo è uno strumento, di solito in esecuzione dal servizio cron.
camper

10

Se il motivo per cui si cancella il registro è lo spazio libero, è possibile cat / dev / null su di essi, senza interrompere i programmi che vi scrivono. Non cancellarli mai! alcuni software potrebbero lamentarsi smettendo di funzionare o ignorando completamente il registro fino al prossimo riavvio

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
Per cancellare i file di registro in modo ricorsivo:for i in $(find /var/log -type f); do cat /dev/null > $i; done
Iurie Malai,

4

Sovrascrittura di contenuti brevi e compatibili: : > /dest/file

Ma c'è anche troncare (2) la chiamata di sistema e il corrispondente strumento di truncatespazio utente su molti * NIX.


1

Se vuoi conservare il file prima di ripulirlo, puoi fare:

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

Se vuoi fare una ricerca per un determinato testo o e-mail nel registro puoi usare grep. Se si desidera conservare alcuni elementi grafici sull'utilizzo della posta, è possibile utilizzare AWStats.


1

Ecco come lo faccio, e questo è solo per NGINX, puoi rimuoverlo per farlo funzionare su tutti i file di registro.

# 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 ... ---------------"
}

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.