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 grepem 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,postrotateexecuta uma vez por arquivo correspondente -- uma tempestade de reloads se voce tiver muitos logs || trueno final do comando postrotate evita que o logrotate falhe quando o servico esta parado- nginx usa
kill -USR1, Apache usaapachectl graceful, servicos systemd usamsystemctl reloadpara 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