SystemD pro Einheit LogRateLimitIntervalSec funktioniert nicht?

SystemD pro Einheit LogRateLimitIntervalSec funktioniert nicht?

Das SystemD-Journal begrenzt die Anzahl der protokollierten Nachrichten gemäß RateLimitIntervalSecden RateLimitBurstglobalen Konfigurationsoptionen. Es besteht die Möglichkeit, diese Werte für bestimmte Einheiten/Dienste mithilfe von Direktiven zu ändern LogRateLimitIntervalSec. LogRateLimitBurstLeider 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 ( LogRateLimitIntervalSecwird 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 beiHello world 12500
  • journalctl -u test.service --no-pagerhä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.conflautet:

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.servicekönnen Sie leicht überprüfen, ob die Einstellung auf einen anderen Wert 0als wie erwartet funktioniert.

verwandte Informationen