
SystemD 日誌會根據全域設定選項限制記錄的RateLimitIntervalSec
訊息RateLimitBurst
。可以根據特定單元/服務使用LogRateLimitIntervalSec
和LogRateLimitBurst
指令來變更這些值。不幸的是,我無法使這些每個服務選項發揮作用。我希望你能幫我找出我做錯了什麼或確認 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 問題追蹤器上報告此問題。
謝謝。
答案1
RateLimitIntervalSec=, RateLimitBurst=
中的部分說man journald.conf
:
若要關閉任何類型的速率限制,請將任一值設為 0。
LogRateLimitIntervalSec=, LogRateLimitBurst=
但是,您在中的部分中找不到此內容man systemd.exec
。透過您,test.service
您可以輕鬆驗證將其設定為除預期之外的其他內容是否0
可以按預期工作。