SystemD por unidade LogRateLimitIntervalSec não está funcionando?

SystemD por unidade LogRateLimitIntervalSec não está funcionando?

O diário do SystemD limita as mensagens registradas de acordo com RateLimitIntervalSecas RateLimitBurstopções de configuração global. Existe a possibilidade de alterar esses valores por unidade/serviço específico usando LogRateLimitIntervalSece LogRateLimitBurstdiretivas. Infelizmente não consigo fazer essas opções por serviço funcionarem. Espero que você me ajude a descobrir o que estou fazendo de errado ou confirme que há algo errado com o systemd.

Meu ambiente:

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

Certifique-se de que os limites globais do diário sejam deixados como padrão em /etc/systemd/journald.conf:

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

e reinicie se alguma alteração for necessária

systemctl restart systemd-journald

Prepare o script de teste /root/test.sh:

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

Prepare a unidade de serviço de teste /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

Certifique-se de que o limite de taxa do rsyslog esteja desativado alterando /etc/rsyslog.conf:

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

Configure o local do arquivo de log do serviço de teste criando /etc/rsyslog.d/test.conf:

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

Reinicie o rsyslog:

systemctl restart rsyslog

Instale o serviço de teste:

# systemctl enable /root/test.service

Verifique as configurações de limite de taxa de serviço de teste ( LogRateLimitIntervalSecarmazenadas internamente como LogRateLimitIntervalUSec):

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

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

Inicie o serviço:

systemctl start test.service

Meu resultado:

  • /root/test.log para emHello world 12500
  • journalctl -u test.service --no-pagerpára emHello world 12500
  • /var/log/messages relatórios (às vezes esta mensagem não é registrada)
systemd-journald[304398]: Suppressed 982500 messages from test.service

Também confirmei que alterar as configurações globais do journald para (e reiniciar o systemd-journald):

[Journal]
RateLimitIntervalSec=0
RateLimitBurst=0

resulta em nenhuma limitação de taxa conforme esperado.

Estou sem noção neste momento. Até tentei analisar o código-fonte do systemd, mas está além da minha cabeça. Se alguém pelo menos recriasse minhas etapas e relatasse os resultados, seria útil relatar isso no rastreador de problemas do systemd Github.

Obrigado.

Responder1

A RateLimitIntervalSec=, RateLimitBurst=seção man journald.confdiz:

Para desativar qualquer tipo de limitação de taxa, defina um dos valores como 0.

No entanto, você não pode encontrar isso na LogRateLimitIntervalSec=, LogRateLimitBurst=seção em man systemd.exec. Com você, test.servicevocê pode verificar facilmente se definir isso para algo diferente 0funciona conforme o esperado.

informação relacionada