Cum să configurați și să gestionați rotația jurnalului folosind Logrotate în Linux


Unul dintre cele mai interesante (și poate unul dintre cele mai importante) directoare dintr-un sistem Linux este /var/log. Conform standardului ierarhiei sistemului de fișiere, activitatea majorității serviciilor care rulează în sistem este scrisă într-un fișier din acest director sau unul dintre subdirectoarele acestuia.

Astfel de fișiere sunt cunoscute sub numele de jurnale și sunt cheia pentru a examina modul în care sistemul funcționează (și cum s-a comportat în trecut). Jurnalele sunt, de asemenea, prima sursă de informații la care se uită administratorii și inginerii în timp ce depanează.

Dacă ne uităm la conținutul /var/log pe un CentOS/RHEL/Fedora și Debian/Ubuntu (pentru varietate), vom vedea următoarele fișiere jurnal și subdirectoare.

Vă rugăm să rețineți că rezultatul poate fi oarecum diferit în cazul dvs., în funcție de serviciile care rulează pe sistemul (sistemele) dvs. și de timpul în care au funcționat.

În RHEL/CentOS și Fedora

ls /var/log

În Debian și Ubuntu

ls /var/log

În ambele cazuri, putem observa că unele dintre numele de jurnal se termină așa cum era de așteptat în „log ”, în timp ce altele sunt fie redenumite folosind o dată (de exemplu, maillog-20160822 pe CentOS) sau comprimat (luați în considerare auth.log.2.gz și mysql.log.1.gz pe Debian puternic>).

Acesta nu este un comportament implicit bazat pe distribuția aleasă, dar poate fi modificat după cum doriți, folosind directivele din fișierele de configurare, așa cum vom vedea în acest articol.

Dacă jurnalele ar fi păstrate pentru totdeauna, acestea ar ajunge în cele din urmă să umple sistemul de fișiere în care se află /var/log. Pentru a preveni acest lucru, administratorul de sistem poate folosi un utilitar frumos numit logrotate pentru a curăța jurnalele în mod periodic.

În câteva cuvinte, logrotate va redenumi sau comprima jurnalul principal atunci când este îndeplinită o condiție (mai multe despre asta într-un minut), astfel încât următorul eveniment să fie înregistrat într-un fișier gol.

În plus, va elimina fișierele jurnal „vechi” și le va păstra pe cele mai recente. Desigur, putem decide ce înseamnă „vechi” și cât de des dorim ca logrotate să curețe jurnalele pentru noi.

Instalarea Logrotate în Linux

Pentru a instala logrotate, trebuie doar să utilizați managerul de pachete:

---------- On Debian and Ubuntu ---------- 
aptitude update && aptitude install logrotate 

---------- On CentOS, RHEL and Fedora ---------- 
yum update && yum install logrotate

Merită să rețineți că fișierul de configurare (/etc/logrotate.conf) poate indica faptul că alte setări mai specifice pot fi plasate pe fișierele individuale .conf din interior /etc/logrotate.d.

Acesta va fi cazul dacă și numai dacă următoarea linie există și nu este comentată:

include /etc/logrotate.d

Vom rămâne cu această abordare, deoarece ne va ajuta să păstrăm lucrurile în ordine și să folosim caseta Debian pentru următoarele exemple.

Configurați Logrotate în Linux

Fiind un instrument foarte versatil, logrotate oferă o mulțime de directive care ne ajută să configuram când și cum vor fi rotite jurnalele și ce ar trebui să se întâmple imediat după.

Să inserăm următorul conținut în /etc/logrotate.d/apache2.conf (rețineți că cel mai probabil va trebui să creați acel fișier) și să examinăm fiecare linie pentru a-i indica scopul:

/var/log/apache2/* {
    weekly
    rotate 3
    size 10M
    compress
    delaycompress
}

Prima linie indică faptul că directivele din bloc se aplică tuturor jurnalelor din /var/log/apache2:

  • săptămânal înseamnă că instrumentul va încerca să rotească jurnalele săptămânal. Alte valori posibile sunt zilnice și lunare.
  • rotirea 3 indică faptul că ar trebui păstrate numai 3 bușteni rotite. Astfel, cel mai vechi fișier va fi eliminat la a patra rulare ulterioară.
  • size=10M setează dimensiunea minimă pentru ca rotația să aibă loc la 10M. Cu alte cuvinte, fiecare jurnal nu va fi rotit până când nu ajunge la 10 MB.
  • comprimare și comprimare întârziată sunt folosite pentru a spune că toate jurnalele rotite, cu excepția celui mai recent, trebuie comprimate.

Să executăm o rulare uscată pentru a vedea ce ar face logrotate dacă ar fi de fapt executat acum. Utilizați opțiunea -d urmată de fișierul de configurare (puteți rula logrotate omițând această opțiune):

logrotate -d /etc/logrotate.d/apache2.conf

Rezultatele sunt prezentate mai jos:

În loc să comprimăm jurnalele, le-am putea redenumi după data când au fost rotite. Pentru a face asta, vom folosi directiva dateext. Dacă formatul nostru de dată este altul decât cel implicit aaaammzz, îl putem specifica utilizând format date.

Rețineți că putem chiar preveni rotația dacă jurnalul este gol cu notifempty. În plus, să îi spunem lui logrotate să trimită prin poștă jurnalul rotit administratorului de sistem ([email  în acest caz) pentru referință (aceasta va necesita configurarea unui server de e-mail, care este în afara domeniului de aplicare al acestui articol).

Dacă doriți să primiți e-mailuri despre logrotate, puteți configura serverul de e-mail Postfix așa cum se arată aici: Instalați serverul de e-mail Postfix

De data aceasta vom folosi /etc/logrotate.d/squid.conf pentru a roti numai /var/log/squid/access.log:

/var/log/squid/access.log {
    monthly
    create 0644 root root
    rotate 5
    size=1M
    dateext
    dateformat -%d%m%Y
    notifempty
    mail [email 
}

După cum putem vedea în imaginea de mai jos, acest jurnal nu a trebuit să fie rotit. Cu toate acestea, când condiția de dimensiune este îndeplinită (size=1M), jurnalul rotit va fi redenumit access.log-25082020 (dacă jurnalul a fost rotit în august 25, 2020) și jurnalul principal (access.log) vor fi re-create cu permisiunile de acces setate la 0644 și cu root ca proprietar și proprietar de grup.

În cele din urmă, când numărul de jurnale ajunge în sfârșit la 6, cel mai vechi jurnal va fi trimis prin poștă la [email .

Acum să presupunem că doriți să rulați o comandă personalizată atunci când are loc rotația. Pentru a face asta, plasați linia cu o astfel de comandă între directivele postrotate și endscript.

De exemplu, să presupunem că vrem să trimitem un e-mail către root atunci când oricare dintre jurnalele din /var/log/myservice este rotit. Să adăugăm liniile cu roșu la /etc/logrotate.d/squid.conf:

/var/log/myservice/* {
	monthly
	create 0644 root root
	rotate 5
	size=1M
    	postrotate
   		echo "A rotation just took place." | mail root
    	endscript
}

Nu în ultimul rând, este important să rețineți că opțiunile prezente în /etc/logrotate.d/*.conf le înlocuiesc pe cele din fișierul principal de configurare în caz de conflicte.

Logrotate și Cron

În mod implicit, instalarea logrotate creează un fișier crontab în /etc/cron.daily numit logrotate. Așa cum este cazul celorlalte fișiere crontab din acest director, acesta va fi executat zilnic începând cu 6:25 am dacă anacron nu este instalat.

În caz contrar, execuția va începe în jurul 07:35. Pentru a verifica, urmăriți linia care conține cron.daily fie în /etc/crontab, fie în /etc/anacrontab.

rezumat

Într-un sistem care generează mai multe jurnale, administrarea unor astfel de fișiere poate fi mult simplificată folosind logrotate. După cum am explicat în acest articol, acesta va roti, comprima, elimina și e-mail automat jurnalele periodic sau când fișierul atinge o anumită dimensiune.

Doar asigurați-vă că este setat să ruleze ca un job cron și logrotate vă va face lucrurile mult mai ușoare. Pentru mai multe detalii, consultați pagina de manual.

Aveți întrebări sau sugestii despre acest articol? Simțiți-vă liber să ne anunțați folosind formularul de comentarii de mai jos.