Logrotate.timer não reagenda

Configurei um Ubuntu Server 22.04 como RSyslog Server, coletando os logs de um determinado elemento da rede.
Configurei o logrotate para “rotacionar” os logs sempre à meia-noite.
O problema é que ele roda uma vez e não executa mais.
Observando o systemctl list-timers, observo que o logrotate foi executado, mas não está mais agendado:

~$ systemctl list-timers
NEXT                        LEFT              LAST                        PASSED       UNIT                           ACTIVATES
Fri 2024-02-16 13:54:01 -03 4h 3min left      Thu 2024-02-15 13:54:01 -03 19h ago      update-notifier-download.timer update-notifier-download.service
Fri 2024-02-16 14:03:51 -03 4h 13min left     Thu 2024-02-15 14:03:51 -03 19h ago      systemd-tmpfiles-clean.timer   systemd-tmpfiles-clean.service
Fri 2024-02-16 18:41:37 -03 8h left           Fri 2024-02-16 09:50:33 -03 3s ago       apt-daily.timer                apt-daily.service
Fri 2024-02-16 19:21:45 -03 9h left           Fri 2024-02-16 08:37:15 -03 1h 13min ago motd-news.timer                motd-news.service
Sat 2024-02-17 00:00:00 -03 14h left          Fri 2024-02-16 00:00:01 -03 9h ago       dpkg-db-backup.timer           dpkg-db-backup.service
Sat 2024-02-17 05:30:20 -03 19h left          Fri 2024-02-16 09:19:15 -03 31min ago    fwupd-refresh.timer            fwupd-refresh.service
Sat 2024-02-17 06:30:16 -03 20h left          Fri 2024-02-16 06:34:15 -03 3h 16min ago apt-daily-upgrade.timer        apt-daily-upgrade.service
Sat 2024-02-17 10:26:44 -03 24h left          Fri 2024-02-16 09:48:42 -03 1min 54s ago man-db.timer                   man-db.service
Sun 2024-02-18 03:10:20 -03 1 day 17h left    Sun 2024-02-11 07:15:00 -03 5 days ago   e2scrub_all.timer              e2scrub_all.service
Mon 2024-02-19 01:10:50 -03 2 days left       Mon 2024-02-12 00:46:46 -03 4 days ago   fstrim.timer                   fstrim.service
Sun 2024-02-25 02:04:18 -03 1 week 1 day left Thu 2024-02-15 13:42:46 -03 20h ago      update-notifier-motd.timer     update-notifier-motd.service
n/a                         n/a               Fri 2024-02-16 00:00:01 -03 9h ago       logrotate.timer                logrotate.service

Já revisei de tudo, procurei soluções na internet e encontrei várias, mas nenhuma resolve.
Se alguém tiver alguma dica, agradeço.

1 curtida

Salve José! Bem-vindo!

As configurações do “logrotate” ficam em /etc/logrotate.conf, você pode ver como está a configuração usando o cat, e editar usando o nano.

cat /etc/logrotate.conf

sudo nano /etc/logrotate.conf

Vale a pena observar que algumas aplicações têm configurações adicionais, dentro de /etc, você também deve encontrar a pasta logrotate.d

cd /etc/logrotate.d/

Dentro dela tem as configurações individuais.

Por exemplo, o “apt”.

sudo nano /etc/logrotate.d/apt

Ele deve te mostrar um arquivo com esse conteúdo mais ou menos:

/var/log/apt/term.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

/var/log/apt/history.log {
  rotate 12
  monthly
  compress
  missingok
  notifempty
}

Repare nas sessões onde diz “monthly”, essa é a frequência, trocar ela para “daily”, faria o rotate ser diário, nesse caso, para o apt em específico.

Assim como o “rotate 12”, quer dizer, quantos arquivos serão mantidos antes que os mais antigos sejam deletados.

Deixo aqui também a man page do comando:
https://manpages.ubuntu.com/manpages/xenial/man8/logrotate.8.html

Essa documentação aqui também pode te ajudar:

https://docs.rackspace.com/docs/understanding-logrotate-utility

Boa sorte! :slight_smile:

Oi, Dio!

Minha config está assim:

$ sudo cat /etc/logrotate.conf
daily
su root adm
rotate 4
create
include /etc/logrotate.d

$ sudo cat /etc/logrotate.d/rsyslog
/var/log/hillstone.lan/nat444.log
{
        su syslog syslog
        rotate 10
        daily
        create
        dateext
        missingok
        notifempty
        compress
        delaycompress
        sharedscripts
        postrotate
                /usr/lib/rsyslog/rsyslog-rotate
        endscript
}

O script logrotate está na pasta /etc/cron.daily:
:/etc/cron.daily$ ls -la

total 52
drwxr-xr-x  2 root root  4096 Feb 15 13:46 .
drwxr-xr-x 98 root root 12288 Feb 16 08:19 ..
-rw-r--r--  1 root root   102 Feb 13  2020 .placeholder
-rwxr-xr-x  1 root root   376 Nov 11  2019 apport
-rwxr-xr-x  1 root root  1478 Oct  6 05:53 apt-compat
-rwxr-xr-x  1 root root   355 Dec 29  2017 bsdmainutils.dpkg-remove
-rwxr-xr-x  1 root root   123 Dec  5  2021 dpkg
-rwxr-xr-x  1 root root   377 Feb 15 13:46 logrotate
-rwxr-xr-x  1 root root  1330 Mar 17  2022 man-db
-rwxr-xr-x  1 root root  5633 May 10  2021 popularity-contest

O comando systemctl status mostra o logrotate.service e logrotate.timer rodando OK.
Meu problema parece estar no agendamento do rotate. Quando eu configuro, ele agenda pra meia-noite, roda uma vez e não agenda mais.

Entendi. Será que pode ser algum problema nos scripts de post rotate? Olhando os dados que você me mostrou, não bati o olho em nada muito errado.

Tem um “su syslog syslog” que não tenho certeza se seria assim, com o nome duplicado, mas enfim.

Ao invés de usar o Cron, vc pode tentar usar o Systemd Timer também para ver se funcionaria.

Dentro do Cron do Logrotate tem uma parte que diz:

# skip in favour of systemd timer
if [ -d /run/systemd/system ]; then
    exit 0
fi

Então, se você criar uma unit de tempo para o logrotate, em tese ele deve ignorar o CRON automaticamente.

Documentação:

https://www.freedesktop.org/software/systemd/man/latest/systemd.timer.html

Qual a saída do comando sudo logrotate -d /etc/logrotate.d/rsyslog? Ele vai executar o script de rotação em modo debug, sem tocar nos arquivos, meio que um dry run. A saída vai ser algo assim:

$ sudo logrotate -d /etc/logrotate.d/<log_config>
WARNING: logrotate in debug mode does nothing except printing debug messages!  Consider using verbose mode (-v) instead if this is not what you want.

reading config file /etc/logrotate.d/<log_config>
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries
Creating new state
...
Creating new state

Handling 1 logs

rotating pattern: <log rotate pattern>
 after 1 days (7 rotations)
empty log files are not rotated, old logs are removed
switching euid from 0 to ### and egid from 0 to ### (pid ########)
considering log <log rotate pattern>
  Now: 2024-02-16 16:34
  Last rotated at 2024-02-16 00:00
  log does not need rotating (log has been rotated at 2024-02-16 00:00, which is less than a day ago)
not running postrotate script, since no logs were rotated
switching euid from ### to 0 and egid from ### to 0 (pid ########)

Depois disso, você pode forçar a rotação também pra ver se não tem algo quebrando. O comando é sudo logrotate -fv /etc/logrotate.d/rsyslog. A flag -f é para forçar a rotação e a -v é pro modo verboso, do contrário você não vai ter um output.

O output vai ser mais ou menos esse:

$ sudo logrotate -fv /etc/logrotate.d/<log_config>
reading config file /etc/logrotate.d/<log_config>
Reading state from file: /var/lib/logrotate/status
Allocating hash table for state file, size 64 entries
Creating new state
...
Creating new state

Handling 1 logs

rotating pattern: <log pattern>
 forced from command line (7 rotations)
empty log files are not rotated, old logs are removed
switching euid from 0 to ### and egid from 0 to ### (pid #######)
considering log <log pattern>
  Now: 2024-02-16 16:51
  Last rotated at 2024-02-16 00:00
  log needs rotating
rotating log <log pattern>, log->rotateCount is 7
dateext suffix '-20240216'
glob pattern '-[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
previous log <log pattern>.1 does not exist
renaming <log pattern>.7.gz to <log pattern>.8.gz (rotatecount 7, logstart 1, i 7),
old log <log pattern>.7.gz does not exist
renaming <log pattern>.6.gz to <log pattern>.7.gz (rotatecount 7, logstart 1, i 6),
old log <log pattern>.6.gz does not exist
renaming <log pattern>.5.gz to <log pattern>.6.gz (rotatecount 7, logstart 1, i 5),
old log <log pattern>.5.gz does not exist
renaming <log pattern>.4.gz to <log pattern>.5.gz (rotatecount 7, logstart 1, i 4),
old log <log pattern>.4.gz does not exist
renaming <log pattern>.3.gz to <log pattern>.4.gz (rotatecount 7, logstart 1, i 3),
old log <log pattern>.3.gz does not exist
renaming <log pattern>.2.gz to <log pattern>.3.gz (rotatecount 7, logstart 1, i 2),
old log <log pattern>.2.gz does not exist
renaming <log pattern>.1.gz to <log pattern>.2.gz (rotatecount 7, logstart 1, i 1),
old log <log pattern>.1.gz does not exist
renaming <log pattern>.0.gz to <log pattern>.1.gz (rotatecount 7, logstart 1, i 0),
old log <log pattern>.0.gz does not exist
log <log pattern>.8.gz doesn't exist -- won't try to dispose of it
renaming <log pattern> to <log pattern>.1
creating new <log pattern> mode = 0664 uid = ### gid = ###
running postrotate script
switching euid from ### to 0 and egid from ### to 0 (pid #######)
switching euid from ### to 0 and egid from ### to 0 (pid #######)

Minha experiência com o logrotate é simplesmente criar a config, definir a periodicidade na config (como você fez) e pronto. Sem agendamento nem nada extra.

Tem um “su syslog syslog” que não tenho certeza se seria assim, com o nome duplicado, mas enfim.

Tá certinho sim :smiley: . O primeiro é o user e o segundo é o grupo pra usar na rotação. logrotate(8) - Linux manual page

1 curtida