Systemd

SystemD 每單位 LogRateLimitIntervalSec 不起作用?

  • January 6, 2022

SystemD 日誌根據RateLimitIntervalSecRateLimitBurst全域配置選項限制記錄的消息。有可能使用LogRateLimitIntervalSecLogRateLimitBurst指令更改每個特定單元/服務的這些值。不幸的是,我無法使這些按服務選項起作用。我希望您能幫助我找出我做錯了什麼或確認 systemd 有問題。

我的環境:

# 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)

確保將全域日誌限制保留為預設值/etc/systemd/journald.conf

[Journal]
#RateLimitIntervalSec=30s
#RateLimitBurst=10000

如果需要進行任何更改,請重新啟動

systemctl restart systemd-journald

準備測試腳本/root/test.sh

#!/bin/bash
for i in {1..1000000}
do
  echo "Hello world $i"
done

準備測試服務單元/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

通過更改確保 rsyslog 速率限制已關閉/etc/rsyslog.conf

module(load="imjournal"
      StateFile="imjournal.state"
      Ratelimit.Interval="0")

通過創建配置測試服務日誌文件位置/etc/rsyslog.d/test.conf

if ($programname == 'test') then {
   action(
       type="omfile"
       File="/root/test.log"
   )
   stop
}

重啟 rsyslog:

systemctl restart rsyslog

安裝測試服務:

# systemctl enable /root/test.service

驗證測試服務速率限制設置(LogRateLimitIntervalSec內部儲存為LogRateLimitIntervalUSec):

# systemctl show --property LogRateLimitIntervalUSec test.service --no-pager
LogRateLimitIntervalUSec=0

# systemctl show --property LogRateLimitBurst test.service --no-pager
LogRateLimitBurst=0

啟動服務:

systemctl start test.service

我的結果:

  • /root/test.log 停在Hello world 12500
  • journalctl -u test.service --no-pager停在Hello world 12500
  • /var/log/messages 報告(有時不記錄此消息)
systemd-journald[304398]: Suppressed 982500 messages from test.service

我還確認將全域日誌設置更改為(並重新啟動 systemd-journald):

[Journal]
RateLimitIntervalSec=0
RateLimitBurst=0

沒有預期的速率限制。

在這一點上我一無所知。甚至試圖分析 systemd 原始碼,但這超出了我的想像。如果有人至少會重新創建我的步驟並報告結果,這將有助於在 systemd Github 問題跟踪器上報告這一點。

謝謝。

中的RateLimitIntervalSec=, RateLimitBurst=部分man journald.conf說:

要關閉任何類型的速率限制,請將任一值設置為 0。

但是,您無法LogRateLimitIntervalSec=, LogRateLimitBurst=man systemd.exec. 有了您test.service,您可以輕鬆驗證將其設置為其他內容,而不是0按預期工作。

引用自:https://serverfault.com/questions/1032321