Basico do logrotate - Mantendo Logs Gerenciaveis com Rotacao Automatica

Basico do logrotate - Mantendo Logs Gerenciaveis com Rotacao Automatica

O Que E o logrotate?

logrotate e um utilitario Linux que automaticamente rotaciona, compacta e exclui arquivos de log antigos em um agendamento. Sem ele, os arquivos de log em /var/log crescem indefinidamente ate o disco encher e os servicos falharem com No space left on device. Ele vem por padrao no Ubuntu e sistemas baseados em RHEL e e executado diariamente via cron.

Resumo Rapido

  • Rotaciona, compacta e remove arquivos de log automaticamente
  • Configuracao em duas camadas: /etc/logrotate.conf (padroes globais) e /etc/logrotate.d/ (por aplicacao)
  • Sempre verifique novas configuracoes com logrotate -d (dry run) antes de depender delas

Por Que a Rotacao de Logs E Importante?

Um servidor nginx ou MySQL ocupado pode gerar gigabytes de logs por dia. Sem rotacao:

  • O disco enche silenciosamente durante a noite
  • Servicos falham com No space left on device
  • grep em um arquivo de 10 GB se torna dolorosamente lento

A maioria das distribuicoes ja vem com /etc/cron.daily/logrotate instalado:

cat /etc/cron.daily/logrotate
#!/bin/sh
/usr/sbin/logrotate /etc/logrotate.conf

Isso e executado uma vez por dia como root. Seu trabalho e escrever os arquivos de configuracao que dizem o que fazer.

Como a Configuracao E Estruturada?

O logrotate usa uma estrutura de configuracao em duas camadas. /etc/logrotate.conf define os padroes globais e inclui tudo em /etc/logrotate.d/ com uma unica diretiva include.

/etc/logrotate.conf        <-- padroes globais
/etc/logrotate.d/          <-- configs por aplicacao (onde a maioria da edicao acontece)
+-- nginx
+-- mysql-server
+-- rsyslog
+-- ...

Um /etc/logrotate.conf tipico:

cat /etc/logrotate.conf
weekly
rotate 4
create
dateext
compress
include /etc/logrotate.d

weekly e rotate 4 sao padroes globais. Qualquer configuracao por aplicacao em /etc/logrotate.d/ pode substitui-los.

O pacote nginx cria sua propria configuracao automaticamente:

cat /etc/logrotate.d/nginx
/var/log/nginx/*.log {
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 0640 www-data adm
        sharedscripts
        postrotate
                if [ -f /run/nginx.pid ]; then
                        kill -USR1 `cat /run/nginx.pid`
                fi
        endscript
}

Diretivas Principais

As diretivas que voce usara com mais frequencia:

Diretiva Significado
daily / weekly / monthly Frequencia de rotacao
rotate N Numero de arquivos antigos a manter (ex: rotate 7 mantem 7 geracoes)
size N Rotacionar quando o arquivo exceder este tamanho (ex: size 100M)
compress Compactar arquivos rotacionados com gzip
delaycompress Atrasar compactacao em um ciclo
missingok Nao dar erro se o arquivo de log estiver ausente
notifempty Pular rotacao se o arquivo estiver vazio
create MODE USER GROUP Criar um novo arquivo de log vazio apos rotacao
dateext Adicionar sufixo de data aos nomes dos arquivos rotacionados
sharedscripts Executar postrotate uma vez mesmo se multiplos arquivos corresponderam ao glob
postrotate / endscript Comandos shell para executar apos a rotacao

Sempre combine compress com delaycompress. Logo apos a rotacao, o processo em execucao pode ainda ter o arquivo antigo aberto. Compacta-lo imediatamente pode causar falhas de escrita. delaycompress espera um ciclo antes de compactar com gzip.

Escrevendo uma Configuracao Personalizada

Crie /etc/logrotate.d/myapp para uma aplicacao que voce implanta:

/var/log/myapp/*.log {
    daily
    rotate 30
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data adm
    dateext
    sharedscripts
    postrotate
        systemctl reload myapp > /dev/null 2>&1 || true
    endscript
}

Pontos-chave:

  • Sem sharedscripts, postrotate executa uma vez por arquivo correspondente -- uma tempestade de reloads se voce tiver muitos logs
  • || true no final do comando postrotate evita que o logrotate falhe quando o servico esta parado
  • nginx usa kill -USR1, Apache usa apachectl graceful, servicos systemd usam systemctl reload para reabrir seus arquivos de log

Como Verificar e Depurar

Sempre teste novas configuracoes com -d (dry run) antes de depender do cron job diario. A flag -d nao faz alteracoes nos arquivos ou no arquivo de status.

logrotate -d /etc/logrotate.d/myapp
reading config file /etc/logrotate.d/myapp
Allocating hash table for state file, size 15360 B

Handling 1 logs

rotating pattern: /var/log/myapp/*.log  after 1 days (30 rotations)
...
rotating log /var/log/myapp/access.log, log->rotateCount is 30
...
not rotating log, since it was already rotated less than 1 days ago

Se a saida disser "already rotated less than 1 days ago" e voce quiser testar a rotacao completa mesmo assim, force com -f:

logrotate -f /etc/logrotate.d/myapp

-f ignora o timestamp em /var/lib/logrotate/status e rotaciona independentemente. Executa-lo varias vezes em sequencia rapida ira sobrescrever arquivos de geracao. Verifique o arquivo de status apos.

Verifique o status atual da rotacao:

cat /var/lib/logrotate/status
logrotate state -- version 2
"/var/log/myapp/access.log" 2026-6-1-3:0:0
"/var/log/nginx/access.log" 2026-6-1-3:0:0

Erros Comuns

postrotate nao surtindo efeito

Se o servico continua escrevendo no arquivo antigo (agora rotacionado), o script postrotate ou nao esta enviando o sinal correto, ou sharedscripts esta faltando. Verifique com lsof:

lsof | grep deleted | grep log

Qualquer processo listado aqui tem o handle do arquivo antigo aberto. Corrija o postrotate para enviar o sinal apropriado ou comando de reload.

Colisao de dateext

Executar logrotate -f duas vezes no mesmo dia causa uma colisao de nome de arquivo dateext. Para ambientes de teste, adicione dateformat -%Y%m%d-%s (precisao de segundos) ou remova manualmente o arquivo rotacionado antes de re-executar.

Usuario ou grupo nao existe

create 0640 www-data adm falha silenciosamente se www-data nao for um usuario valido naquele sistema. Verifique com id www-data e use o modo verbose para ver o erro exato:

logrotate -v /etc/logrotate.d/myapp 2>&1 | head -30

Proximas Leituras