
Das SystemD-Journal begrenzt die Anzahl der protokollierten Nachrichten gemäß RateLimitIntervalSec
den RateLimitBurst
globalen Konfigurationsoptionen. Es besteht die Möglichkeit, diese Werte für bestimmte Einheiten/Dienste mithilfe von Direktiven zu ändern LogRateLimitIntervalSec
. LogRateLimitBurst
Leider kann ich diese Optionen für einzelne Dienste nicht zum Laufen bringen. Ich hoffe, Sie helfen mir herauszufinden, was ich falsch mache, oder bestätigen, dass mit systemd etwas nicht stimmt.
Meine Umgebung:
# uname -srvmpio
Linux 4.18.0-193.14.2.el8_2.x86_64 #1 SMP Sun Jul 26 03:54:29 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
# cat /etc/centos-release
CentOS Linux release 8.2.2004 (Core)
# systemctl --version
systemd 239
+PAM +AUDIT +SELINUX +IMA -APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD +IDN2 -IDN +PCRE2 default-hierarchy=legacy
# rsyslogd -v
rsyslogd 8.1911.0-3.el8 (aka 2019.11)
Stellen Sie sicher, dass die globalen Journald-Grenzwerte in folgenden Fällen auf den Standardwerten belassen werden /etc/systemd/journald.conf
:
[Journal]
#RateLimitIntervalSec=30s
#RateLimitBurst=10000
und starten Sie neu, wenn eine Änderung notwendig war
systemctl restart systemd-journald
Bereiten Sie das Testskript vor /root/test.sh
:
#!/bin/bash
for i in {1..1000000}
do
echo "Hello world $i"
done
Bereiten Sie die Test-Serviceeinheit vor /root/test.service
:
[Unit]
Description=Test limit service
[Service]
Type=simple
WorkingDirectory=/root
ExecStart=/root/test.sh
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=test
LogRateLimitIntervalSec=0
LogRateLimitBurst=0
[Install]
WantedBy=multi-user.target
Stellen Sie sicher, dass die Ratenbegrenzung von rsyslog deaktiviert ist, indem Sie Folgendes ändern /etc/rsyslog.conf
:
module(load="imjournal"
StateFile="imjournal.state"
Ratelimit.Interval="0")
Konfigurieren Sie den Speicherort der Testdienst-Protokolldatei, indem Sie Folgendes erstellen /etc/rsyslog.d/test.conf
:
if ($programname == 'test') then {
action(
type="omfile"
File="/root/test.log"
)
stop
}
Starten Sie rsyslog neu:
systemctl restart rsyslog
Installieren Sie den Testdienst:
# systemctl enable /root/test.service
Überprüfen Sie die Ratenbegrenzungseinstellungen des Testdienstes ( LogRateLimitIntervalSec
wird intern wie folgt gespeichert LogRateLimitIntervalUSec
):
# systemctl show --property LogRateLimitIntervalUSec test.service --no-pager
LogRateLimitIntervalUSec=0
# systemctl show --property LogRateLimitBurst test.service --no-pager
LogRateLimitBurst=0
Starten Sie den Dienst:
systemctl start test.service
Mein Ergebnis:
- /root/test.log stoppt bei
Hello world 12500
journalctl -u test.service --no-pager
hält anHello world 12500
- /var/log/messages meldet (manchmal wird diese Nachricht nicht protokolliert)
systemd-journald[304398]: Suppressed 982500 messages from test.service
Ich habe auch bestätigt, dass das Ändern der globalen Journald-Einstellungen wie folgt funktioniert (und systemd-journald neu gestartet wird):
[Journal]
RateLimitIntervalSec=0
RateLimitBurst=0
führt wie erwartet zu keiner Ratenbegrenzung.
Ich bin an diesem Punkt ratlos. Habe sogar versucht, den systemd-Quellcode zu analysieren, aber das geht über meinen Horizont. Wenn jemand zumindest meine Schritte nachstellen und die Ergebnisse melden würde, wäre das hilfreich, um dies im systemd Github Issue Tracker zu melden.
Danke.
Antwort1
Der RateLimitIntervalSec=, RateLimitBurst=
Abschnitt man journald.conf
lautet:
Um jegliche Art der Ratenbegrenzung auszuschalten, setzen Sie einen der Werte auf 0.
Sie können dies jedoch nicht im LogRateLimitIntervalSec=, LogRateLimitBurst=
Abschnitt in finden man systemd.exec
. Mit Ihrer test.service
können Sie leicht überprüfen, ob die Einstellung auf einen anderen Wert 0
als wie erwartet funktioniert.