Ubuntu 16.04 Server: Installare e configurare logrotate

logrotate è uno strumento che sostituisce i file di log in base a condizioni di frequenza o dimensione e gestisce i file precedenti memorizzandoli, comprimendoli o eliminandoli. Su Ubuntu, può gestire log in continua crescita, ma il momento effettivo della sostituzione dipende dal programma di esecuzione di logrotate e dalle condizioni di configurazione.

Supporto e preparazione per Ubuntu 16.04

La manutenzione generale della sicurezza per Ubuntu 16.04 LTS e la manutenzione generale estesa della sicurezza (ESM) per Ubuntu Pro sono terminate. Canonical offre servizi aggiuntivi separati per le versioni legacy, quindi verifica la copertura e i costi alla pagina Guida al supporto di Ubuntu 16.04, e pianifica di aggiornare a una versione di Ubuntu supportata, se possibile. I principi di base riportati di seguito si applicano anche ad altre versioni, ma il comportamento dettagliato può variare a seconda della versione di logrotate installata e del programma di esecuzione.

Per prima cosa, verifica se è installato e, se il pacchetto non è presente su Ubuntu, installalo. Prima di modificare le impostazioni del server di produzione, assicurati di controllare i metodi di backup e ripristino delle impostazioni esistenti e dei log necessari.

logrotate --version
sudo apt update
sudo apt install logrotate

Controlla le impostazioni predefinite e il programma di esecuzione

Le impostazioni globali si trovano generalmente in /etc/logrotate.conf, e le impostazioni individuali vengono lette se il file è configurato per includere /etc/logrotate.d/. Controlla i file effettivi sul server. In ambienti in cui è installato il pacchetto Apache, /etc/logrotate.d/apache2 può esistere, ma il percorso del registro e le impostazioni variano a seconda dell'ambiente di installazione.

cat /etc/logrotate.conf
ls -l /etc/logrotate.d/
cat /etc/logrotate.d/apache2

Nei sistemi senza file di configurazione Apache, l'ultimo comando potrebbe fallire. Non gestire lo stesso percorso del registro in modo ridondante in due configurazioni. logrotate non viene eseguito continuamente da solo né programma la propria esecuzione. Su Ubuntu 16.04, di solito viene eseguito periodicamente tramite /etc/cron.daily/logrotate, quindi controlla quel file e se viene eseguito tramite cron. In altre versioni, gli orari effettivi possono differire, ad esempio con i timer di systemd.

Crea registri di test indipendenti e impostazioni

L'esercizio seguente utilizza una nuova directory temporanea invece dei registri di produzione. Esegui nell'ordine nella stessa shell e controlla i percorsi di output. Utilizza una directory temporanea e file di stato separati, quindi non modifica le impostazioni o lo stato di logrotate esistenti del sistema.

demo_dir=$(mktemp -d)
printf 'first log line\n' > "$demo_dir/app.log"
cat > "$demo_dir/logrotate.conf" <<EOF
$demo_dir/app.log {
    daily
    rotate 3
    missingok
    notifempty
    compress
    delaycompress
    create 0600
}
EOF
printf 'Test directory: %s\n' "$demo_dir"
cat "$demo_dir/logrotate.conf"

daily è una condizione di rotazione giornaliera, e rotate 3 è un'impostazione che mantiene i registri precedenti fino a tre rotazioni. missingok evita errori quando un file non esiste, e notifempty non ruota i registri vuoti. compress comprime i registri precedenti, e delaycompress ritarda la compressione del registro appena ruotato fino alla rotazione successiva. create 0600 imposta i permessi quando crea nuovi file di registro dopo la rotazione.

Il file di configurazione in questo esempio non è registrato nella pianificazione del sistema e nessuna applicazione effettiva scrive nel registro di prova. Impostare daily non crea una pianificazione per l'esecuzione stessa. Fare riferimento al manuale ufficiale logrotate per controllare le opzioni e le condizioni appropriate per la versione installata.

Controllo delle prove e delle rotazioni effettive

Per prima cosa, controllare le impostazioni e il comportamento previsto in modalità debug. -d non modifica i registri né aggiorna i file di stato. Con un nuovo file di stato, l'output può indicare che non è ancora il momento della rotazione.

logrotate -d -s "$demo_dir/state" "$demo_dir/logrotate.conf"

Forza una rotazione solo nel file di pratica e controlla i risultati. -f forza la rotazione anche se le condizioni non sono soddisfatte, quindi non dovrebbe essere usato senza cura sui log di operazioni effettive.

logrotate -v -f -s "$demo_dir/state" "$demo_dir/logrotate.conf"
ls -l "$demo_dir"
cat "$demo_dir/app.log.1"

Se ha successo, il contenuto originale si trova in app.log.1 e viene creato un nuovo app.log. La porzione ruotata più recente non è ancora compressa a causa di delaycompress. Dopo aver aggiunto contenuto al nuovo log e forzato una rotazione un'altra volta, la porzione ruotata precedente viene generalmente compressa come app.log.2.gz.

printf 'second log line\n' >> "$demo_dir/app.log"
logrotate -v -f -s "$demo_dir/state" "$demo_dir/logrotate.conf"
ls -l "$demo_dir"
gzip -cd "$demo_dir/app.log.2.gz"

Puoi controllare la prima riga del log dall'ultimo comando. Questo esercizio non riproduce un servizio in esecuzione che registra log. Quando l'esercizio è completato, controlla il percorso temporaneo dove è stato salvato l'output e ripulisci eventuali file che non ti servono più.

Applicazione a un servizio in produzione

Un programma in esecuzione può continuare a scrivere nel file di log precedente anche dopo che il file è stato rinominato. Controlla la procedura fornita per far riaprire il file di log al servizio e rivedi lo script postrotate dal pacchetto esistente, e verifica se il proprietario, il gruppo e i permessi del nuovo file sono appropriati per il servizio. Prima di modificare le regole Apache esistenti, rivedi la documentazione della distribuzione e del servizio e esegui il backup della tua configurazione.

copytruncate copia il registro e poi tronca l'originale sul posto; può essere utilizzato per programmi che non possono riaprire i loro file di registro, ma i registri possono andare persi tra la copia e il troncamento. Quando possibile, controlla prima se il servizio ha un modo per riaprire il registro. rotate 3 si riferisce al numero di rotazioni da mantenere, non a un limite in giorni o dimensioni, quindi la politica di conservazione e l'uso del disco devono essere controllati separatamente.

Cosa controllare se la rotazione non avviene

  • Verificare che il file di configurazione sia incluso nelle impostazioni globali e che il percorso di destinazione corrisponda al registro effettivo. I file vuoti non vengono ruotati in notifempty.
  • Verifica se il cron o il timer sono effettivamente in esecuzione e se la rotazione è necessaria in base al file di stato e alle condizioni periodiche. daily non garantisce la rotazione esatta giornaliera negli ambienti controllati una volta al giorno.
  • Cerca problemi con permessi, proprietà, sintassi e percorsi duplicati nell'output di debug e nei log degli errori del scheduler. Esamina i risultati e i piani di recupero prima di applicare -f ai log operativi.