logrotate în Linux / Bash

Procese și monitorizare logrotate 3.x

Rotește, comprimă și șterge automat fișierele de jurnal vechi, ca să nu umple discul.

Sintaxă comandă
logrotate [-d] [-f] [-v] FIȘIER_CONFIGURARE

Ce face logrotate

Jurnalele aplicațiilor cresc continuu. logrotate „rotește” un fișier de jurnal: îl redenumește (app.log devine app.log.1), creează un fișier nou gol, comprimă versiunile vechi și le șterge pe cele care depășesc numărul păstrat.

Configurația generală este în /etc/logrotate.conf, iar fiecare aplicație își pune regulile în /etc/logrotate.d/. Pe distribuțiile cu systemd, rularea zilnică se face prin logrotate.timer; pe sistemele mai vechi, prin /etc/cron.daily/logrotate.

Înainte să activezi o configurație nouă, testeaz-o cu logrotate -d (mod de depanare, nu modifică nimic). Cu -f forțezi o rotire imediată, utilă la verificare.

Opțiuni și argumente

Opțiune / Parametru Descriere
daily / weekly / monthly Cât de des se rotește jurnalul.
rotate N Câte versiuni vechi se păstrează; cele mai vechi se șterg.
compress / delaycompress Comprimă versiunile vechi cu gzip; delaycompress lasă necomprimată cea mai recentă (.1).
missingok / notifempty Nu da eroare dacă fișierul lipsește; nu roti un fișier gol.
create MOD UTILIZATOR GRUP Creează fișierul nou cu permisiunile și proprietarul dați.
copytruncate Copiază jurnalul și golește originalul, pentru aplicații care nu pot redeschide fișierul.
postrotate ... endscript Comenzi rulate după rotire (de exemplu reîncărcarea serviciului).
-d, -f, -v Depanare fără modificări, rotire forțată, afișare detaliată.

Exemple

Exemplul 1: Reguli pentru jurnalele unei aplicații, testate cu -d

Scriem fișierul /etc/logrotate.d/magazin: rotire zilnică, 14 versiuni păstrate, comprimare, iar după rotire PHP-FPM este reîncărcat ca să redeschidă fișierele. Apoi -d arată ce ar face logrotate, fără să atingă fișierele.

sudo tee /etc/logrotate.d/magazin > /dev/null <<'EOF'
/var/log/magazin/*.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    sharedscripts
    postrotate
        systemctl reload php8.4-fpm > /dev/null 2>&1 || true
    endscript
}
EOF
sudo logrotate -d /etc/logrotate.d/magazin

Ieșire în terminal

reading config file /etc/logrotate.d/magazin
Handling 1 logs

rotating pattern: /var/log/magazin/*.log  after 1 days empty log files are not rotated, (14 rotations), old logs are removed
considering log /var/log/magazin/comenzi.log
  log needs rotating
rotating log /var/log/magazin/comenzi.log, log->rotateCount is 14

Exemplul 2: Rotire forțată și rezultatul pe disc

După rotire, jurnalul curent este nou și gol, iar versiunea de ieri a devenit .1.

sudo logrotate -f /etc/logrotate.d/magazin
ls /var/log/magazin/

Ieșire în terminal

comenzi.log  comenzi.log.1  comenzi.log.2.gz  comenzi.log.3.gz

Greșeli frecvente

  • Aplicația scrie în continuare în fișierul vechi (.1) după rotire: ori reîncarci serviciul în postrotate, ori folosești copytruncate.
  • Permisiuni greșite la create: aplicația nu mai poate scrie în jurnalul nou și pierzi mesajele.
  • Configurație netestată: o eroare de sintaxă în /etc/logrotate.d/ poate opri rotirea; rulează mereu întâi logrotate -d.

Comenzi înrudite

  • journalctl: Interoghează și filtrează jurnalele centrale de sistem gestionate de serviciul systemd-journald.
  • systemd timers (systemctl list-timers): Programează sarcini repetate cu unități .timer în systemd, o alternativă la cron cu jurnal și dependențe.
  • gzip: Comprimă fișiere individuale folosind algoritmul Lempel-Ziv (LZ77) și adaugă extensia .gz.