Je galère toujours un peu avec les trouzemilles syntaxes de rsyslog (démon de journalisation), donc je prends quelques notes.
Fil rouge :
/var/log/distant/<ANNÉE>/<MOIS>/<JOUR>/bidule/programme1.log
et /var/log/distant/<ANNÉE>/<MOIS>/<JOUR>/bidule/programme2.log
. On veut un nom compréhensible, pas le vrai nom du programme.
Au début, je récupère un bout de conf' existant sur notre rsyslog :
$template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
+machine1
*.* -?chemin-prog1
+machine2
*.* -?chemin-prog1
Ce bout de code ne valide pas la deuxième consigne de notre fil rouge, mais c'est pour commencer.
Sauf qu'un redémarrage de rsyslog crache « BSD-style blocks are no longer supported in rsyslog ». Game over.
Tentons une autre syntaxe :
$template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
:programname, isequal, "prog1" -?chemin-prog1
Ça fonctionne, mais pas vraiment : « - » n'a plus l'effet escompté, le message syslog est consigné dans programme1.log et dans /var/log/syslog, ce qui n'est pas ce que nous voulons (/var/log/distant n'est pas un montage NFS pour rien).
Utilisons une syntaxe qui enchaîne plusieurs actions :
$template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
:programname, isequal, "prog1" -?chemin-prog1
& stop
Je rappelle que la syntaxe « & ~ » n'est plus prise en charge depuis plusieurs années. ;)
Cela fonctionne.
Mais j'aimerai vraiment trier aussi en fonction du nom d'hôte renseigné dans le message syslog.
Objectif : si un jour j'utilise le même programme sur d'autres machines et que leur journal est envoyé sur ce serveur de journalisation, je ne voudrai pas forcément mélanger cette nouvelle machine aux existantes (usage différent, journal différent, par exemple).
Utilisons un peu la """"nouvelle"""" syntaxe (RainerScript) :
$template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
if $programname == 'prog1' and $hostname == 'machine1' then ?chemin-prog1
& stop
Ça fonctionne, mais ça va devenir illisible car il faut une ligne par couple { nom d'hôte ; nom de programme }. Deux hôtes + deux programmes = 4 lignes. (En vrai, il faut deux lignes par couple, l'instruction et « stop ».)
Factorisons :
$template chemin-prog1, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log"
$template chemin-prog2, "/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme2.log"
if $hostname == 'machine1' or $hostname == 'machine2' then {
if $programname == 'prog1' then ?chemin-prog1
& stop
if $programname == 'prog2' then ?chemin-prog2
& stop
}
Ben voilàààà ! :)
Et si l'on utilisait un peu plus la """"nouvelle"""" syntaxe ?
template (name="chemin-prog1" type="string" string="/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme1.log")
template (name="chemin-prog2" type="string" string="/var/log/distant/%$year:::%/%$month:::%/%$day:::%/bidule/programme2.log")
if $hostname == 'machine1' or $hostname == 'machine2' then {
if $programname == 'prog1' then {
action(type="omfile" dynaFile="chemin-prog1")
stop
}
if $programname == 'prog2' then {
action(type="omfile" dynaFile="chemin-prog2")
stop
}
}
ÉDIT DU 02/05/2022 À 23 H 35 : j'ai rédigé un autre shaarli sur le changement de mode / propriétaire / groupe d'un fichier journal avec rsyslog (ça s'applique aussi à une arborescence de stockage des journaux).
Et encore un autre sur l'envoi de journaux à un serveur syslog avec un client rsyslog. FIN DE L'ÉDIT.
Si l'on fait du syslog distant, vérifier que le flux arrive sur le serveur de journalisation avec tcpdump -n port 514
+ vérifier que le flux syslog n'est pas bloqué par un pare-feu local (tcpdump
sur le serveur de journalisation se place avant le Netfilter du même serveur ;) ).
Vérifier que l'on utilise les bonnes propriétés pour travailler sur le flux syslog. Coquille classique : « $fromhost » != « $hostname ». La première contient le nom d'hôte de l'émetteur syslog tel que le serveur syslog l'a résolu à partir de l'IP source des paquets syslog qu'il reçoit. La deuxième est le nom d'hôte tel que l'émetteur syslog l'a consigné dans le message syslog.
Vérifier que nos filtres utilisent bien le nom absolu (FQDN) ou non en fonction de ce que contiennent les propriétés sur lesquelles on travaille.
Voir le contenu / la valeur des propriétés / variables :
:programname, isequal, "prog1" /tmp/debug_rsyslog;RSYSLOG_DebugFormat
& stop
Si l'on connait la valeur d'aucune propriété (mais, forcément, ça va débiter pas mal) :
*.* /tmp/debug_rsyslog;RSYSLOG_DebugFormat