SystemD 每个单元的 LogRateLimitIntervalSec 不起作用?

SystemD 每个单元的 LogRateLimitIntervalSec 不起作用?

SystemD 日志根据RateLimitIntervalSec和全局配置选项限制记录的消息。可以使用和指令RateLimitBurst更改每个特定单元/服务的这些值。不幸的是,我无法使这些每个服务的选项起作用。我希望你能帮助我找出我做错的地方或确认 systemd 出了问题。LogRateLimitIntervalSecLogRateLimitBurst

我的环境:

# 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

我还确认将全局 journald 设置更改为(并重新启动 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按预期工作。

相关内容