Come loggare da macchine remote con rsyslog (Debian 9 / Devuan Ascii e successive)
Nota bene: questa pagina si riferisce a rsyslog versione 8.24. Le versioni vecchie avevano sintassi diversa.
Configurazione della macchina che deve ricevere i log
- Modificare /etc/rsyslog.conf per abilitare la ricezione remota. Possiamo usare TCP, UDP, e/o RELP.
- Per usare TCP e UDP, scommentare queste righe:
# provides UDP syslog reception module(load="imudp") input(type="imudp" port="514") # provides TCP syslog reception module(load="imtcp") input(type="imtcp" port="514")
Per usare RELP, occorre installare il pacchetto rsyslog-relp e poi aggiungere la configurazione per RELP, così:
# provides RELP syslog reception module(load="imrelp") input(type="imrelp" port="2514" maxDataSize="10k" keepAlive="on")
- Per usare TCP e UDP, scommentare queste righe:
- Creare un file di configurazione che salvi i log di ogni macchina remota in un posto definito. Nel mio caso e` /var/log/remote/hostname-della-macchina.log. Il file lo chiamiamo come vogliamo e lo mettiamo dentro a /etc/rsyslog.d, per esempio possiamo chiamarlo "remote.conf". Possiamo anche inserire le righe dentro al file /etc/rsyslog.conf stesso, in questo caso vanno PRIMA dell'include da rsyslog.d. Va notato che qui e` possibile fare veramente di tutto, volendo. Occorre studiare come funziona rsysylog, comunuque, che non e` banale.
# alcuni esempio di template per definire il nome del file generato (ne potete scommentare SOLO UNO) #template (name="Remote" type="string" string="/var/log/remote/%fromhost-ip%.log") template (name="Remote" type="string" string="/var/log/remote/%hostname%.log") #template (name="Remote" type="string" string="/var/log/remote/%hostname%_%syslogfacility-text%.log") #template (name="Remote" type="string" string="/var/log/remote/%hostname%/%syslogfacility-text%.log") # questo template aggiunge il nome della facility dentro ad ogni riga del log. # inoltre genera il timestamp includendo la time zone attuale (della macchina che genera il log, # non di quella che lo sta ricevendo) template(name="RemoteFormat" type="list") { property(name="timestamp" dateFormat="rfc3339") constant(value=" ") property(name="syslogfacility-text") constant(value=" ") property(name="hostname") constant(value=" ") property(name="syslogtag") property(name="msg" spifno1stsp="on" ) property(name="msg" droplastlf="on" ) constant(value="\n") } # le righe qui sotto eseguono l'azione vera di salvare i log non locali. # se il log non e` locale (non viene da 127.0.0.1), allora trattalo con # i template qui sopra indicati (il che lo fa salvare dove e come voglio io) if not ($fromhost-ip startswith '127.') then { action(type="omfile" dynaFile="Remote" template="RemoteFormat") stop }
- Creare la directory /var/log/remote/
- Aggiungere una regola che ruoti i log dentro a /var/log/remote onde non trovarsi con log di 100 GB. Questo si puo` fare ad esempio aggiungendo in cima al file /etc/logrotate.d/rsyslog, subito sotto la riga che dice "/var/log/syslog" (e` la prima in alto) una riga che dice "/var/log/remote/*.log".
/var/log/syslog /var/log/remote/*.log { rotate 7 daily missingok notifempty delaycompress compress postrotate invoke-rc.d rsyslog rotate > /dev/null endscript } ... ECCETERA
A questo punto, fatto un restart di rsyslog, tutto dovebbe iniziare a funzionare.
Configurazione della macchina che deve inviare i log
- Per inviare i log via udp o tcp, modificare il file /etc/rsyslog.conf inserendo la direttiva di invio dei log remoti. Si puo` farlo anche piu` volte, specificando diverse impostazioni per il filtro.
# solo auth (via tcp, due "@") auth,authpriv.* @@192.168.99.6 # tutto (via tcp, due "@") *.* @@192.168.99.6 # tutto (via udp, una sola "@") *.* @192.168.99.6
- Per inviare i log via RELP, la cosa si complica un poco: occorre abilitare il modulo RELP e poi definire quali log mandare al remoto
# carico il modulo per inviare via RELP module(load="omrelp") # invio i log che voglio via RELP auth,authpriv.* :omrelp:192.168.99.6:2514