fix(proxy): séparer le listener rsyslog du catch-all générique

Le catch-all du récepteur générique vivait dans 10-remote-receiver.conf,
chargé avant tout 50-<service>.conf (rsyslog charge /etc/rsyslog.d/*.conf
par ordre alphabétique, et les règles d'un ruleset s'exécutent dans
l'ordre de chargement). Chaque message tagué finissait donc écrit deux
fois : une fois par le catch-all générique, une fois par sa règle
dédiée.

10-remote-receiver.conf ne contient plus que module()/input(). Le
catch-all part dans 90-remote-fallback.conf, chargé après tout
50-<service>.conf, dont le `stop` empêche alors effectivement la
double écriture.

Gardé sur la syntaxe legacy $RuleSet plutôt que l'objet moderne
ruleset(name=...){...} suggéré en review : ce dernier refuse d'être
déclaré une seconde fois pour le même nom ("ruleset ... specified more
than once"), ce qui casserait dès qu'un 50-<service>.conf ajoute ses
propres règles au même ruleset remoteLogs — précisément le mécanisme
que ce découpage doit permettre. $RuleSet est un sélecteur de contexte,
pas une déclaration unique ; n'importe quel nombre de fichiers peut le
rouvrir pour y ajouter des règles. Détail dans le commentaire du script
et dans le README.

README : table mise à jour (3 fichiers au lieu de 2), exemple avec
`stop`, et la phrase sur ce qui atterrit dans /var/log/remote/ corrigée
(uniquement ce qui n'est pas réclamé, pas "tout").
This commit is contained in:
Damien
2026-08-01 18:10:21 +02:00
parent 75d10385d7
commit 4744de1a43
2 changed files with 46 additions and 8 deletions
+25 -5
View File
@@ -190,16 +190,36 @@ EOF
# their logs to this receiver over TCP; adding a new one is a matter of
# dropping a 50-<service>.conf here (see proxy/README.md) — nothing else
# to touch.
#
# 10- carries only the listener (module/input): rsyslog loads
# /etc/rsyslog.d/*.conf in filename order, and rules within a ruleset
# execute in the order they were loaded. A catch-all defined here would
# run *before* any 50-<service>.conf's rules ever get a chance — every
# message would double up into both the generic file and the
# service-specific one. The catch-all instead lives in
# 90-remote-fallback.conf (below, written after this block) so it loads
# last, and a service's `stop` actually prevents fallthrough into it.
sudo mkdir -p /var/log/remote
sudo tee /etc/rsyslog.d/10-remote-receiver.conf > /dev/null << EOF
module(load="imtcp")
\$RuleSet remoteLogs
\$template RemoteLogPath,"/var/log/remote/%HOSTNAME%.log"
*.* ?RemoteLogPath
\$RuleSet RSYSLOG_DefaultRuleset
input(type="imtcp" port="${RSYSLOG_PORT}" address="${RSYSLOG_BIND_ADDR}" ruleset="remoteLogs")
EOF
# Catch-all for anything a 50-<service>.conf doesn't claim (or before one
# exists yet). Kept on the legacy $RuleSet/$template directives rather
# than the modern ruleset(name=...){...} object: rsyslog rejects a named
# ruleset declared via that object syntax more than once ("ruleset ...
# specified more than once"), which would break the moment a
# 50-<service>.conf tries to add its own rules to the same "remoteLogs"
# ruleset — the entire point of this split. $RuleSet <name> is a context
# selector, not a one-shot declaration, so any number of files can
# reopen it to append rules.
sudo tee /etc/rsyslog.d/90-remote-fallback.conf > /dev/null << 'EOF'
$RuleSet remoteLogs
$template RemoteLogPath,"/var/log/remote/%HOSTNAME%.log"
*.* ?RemoteLogPath
$RuleSet RSYSLOG_DefaultRuleset
EOF
sudo tee /etc/logrotate.d/remote-logs > /dev/null << 'EOF'