systemd-journald - rsyslog interazione

Avendo recentemente perso per strada un po' di log (30/40 mila) ho deciso di approfondire (almeno in parte) l'argomento, con particolare attenzione all'interazione fra il classico rsyslog e il "nuovo" journald di systemd, entrambi installati sulla mia fedele Centos 7.

Il primo elemento da tenere in considerazione è che, in presenza di systemd, i log vengono gestiti dal servizio systemd-journald tramite varie sorgenti
https://www.freedesktop.org/software/systemd/man/systemd-journald.service.html

Di default systemd memorizza i log in un file system temporaneo, /run/log/journald che quindi viene resettato a ogni reboot. Sarà quindi normale, andando a interrogare il journal tramite jorunalctl

trovare un solo boot del sistema.

Per rendere i log nativi di systemd persistenti a un reboot è sufficente andare a creare la cartella /var/log/journal e riavviare systemd-journald.

Questo funziona perchè, sempre di default, in /etc/systemd/journald.conf è specificato
Storage=auto
ovvero memorizza i dati in maniera persistente se trova la directory /var/log/journal, altrimenti li salva solo in /run/log/journal.

E' possibile anche andare a modificare la massima dimensione del journal tramite la direttiva
SystemMaxUse=500M
e verificare al volo la dimensione attuale del journal tramite il comando

 

I log tradizionali che mi aspetto su un sistema basato su RedHat

esistono e funzionano "come ci si aspetta" perchè è presente anche il demone rsyslog.

All'interno del file di configurazione di rsyslog (/etc/rsyslog.conf) è attivo un modulo

che permette a rsyslog di leggersi i log di systemd-journald e andare a popolare i file tradizionali (che poi verranno ruotati dal solito cron logrotate).
http://www.rsyslog.com/doc/v8-stable/configuration/modules/imjournal.html

Alcune direttive del modulo imjournal specificano un limite massimo di messaggi che possono essere ricevuti in un certo tempo. Il default è 20000 messaggi in 10 minuti e puoi essere cambiato, per sempio, in questo modo:

50000 messaggi ogni minuto.

Nota che anche systemd-journald ha un limite di log ricevuti in un determinato intevallo di tempo, configurabili in /etc/systemd/journald.conf tramite le direttive

Di default abbiamo 1000 messaggi in 30 secondi (ovvero 20000 messaggi in 10 minuti).

La modalità alternativa per permettere a rsyslog di leggersi i log di systemd-journald, che non è di default in Centos 7 ma lo è per esempio in Debian Jessie, fa uso del modulo imuxsock
http://www.rsyslog.com/doc/v8-stable/configuration/modules/imuxsock.html
che permette a rsyslog di andare a leggere lo unix socket (di default /run/systemd/journal/syslog) dove il journal di systemd comunica i messaggi loggati.


Trovarsi in /var/log/messages log di questo tipo

significa che rsyslog ha ricevuto troppi messaggi e  ha quindi iniziato a non scriverne. Il guaio è che, essendo questo un log di rsyslog non lo si trova nel journal di systemd. D'altra parte però, se rsyslog sta sopprimendo i messaggi, neanche questo log viene scritto per cui mi è successo il simpatico effetto di non trovarmi più log in /var/log/messages e di non capire perchè. Un semplice riavvio di rsyslog mi ha scritto il log sopracitato e permesso di aumentare i limiti.


Qui, nella documentazione di RedHat, c'è spiegato tutto.
https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/s1-interaction_of_rsyslog_and_journal.html

 

Print Friendly, PDF & Email