Como usar o logrotate para gerenciar logs de aplicações customizadas
1. Introdução ao logrotate e sua importância
O logrotate é uma ferramenta essencial no ecossistema Linux para administradores de sistemas que precisam gerenciar arquivos de log de forma automática e eficiente. Sem ele, logs de aplicações podem crescer indefinidamente, ocupando espaço em disco, causando lentidão em operações de I/O e até mesmo levando à perda de dados críticos quando o disco fica completamente cheio.
O funcionamento básico do logrotate é simples: ele executa rotação periódica de arquivos de log, podendo compactá-los, removê-los após um período definido e até mesmo executar scripts personalizados após cada rotação. A ferramenta é executada tipicamente como uma tarefa cron diária, mas pode ser configurada para rodar em intervalos personalizados.
2. Estrutura básica de configuração do logrotate
Os arquivos de configuração do logrotate ficam em dois locais principais:
- /etc/logrotate.conf — configuração global
- /etc/logrotate.d/ — diretório com configurações específicas para cada aplicação
A sintaxe de uma diretiva básica segue este padrão:
/var/log/minhaapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
}
Parâmetros fundamentais incluem:
- rotate: número de versões antigas mantidas antes da remoção
- daily/weekly/monthly: frequência da rotação baseada em tempo
- compress: compacta logs rotacionados com gzip
- delaycompress: adia a compressão em uma rotação (útil para logs que ainda podem ser acessados)
3. Criando uma configuração personalizada para sua aplicação
Vamos criar uma configuração para uma aplicação hipotética que gera logs em /var/log/minhaapp/. O arquivo deve ser criado em /etc/logrotate.d/minhaapp:
/var/log/minhaapp/*.log {
daily
rotate 14
size 100M
missingok
notifempty
compress
delaycompress
create 0640 appuser appgroup
}
Neste exemplo:
- daily: rotação diária
- rotate 14: mantém 14 versões antigas
- size 100M: força rotação também quando o log atinge 100MB
- missingok: não gera erro se o arquivo de log não existir
- notifempty: não rotaciona logs vazios
- create: define permissões e proprietário do novo arquivo de log
4. Gerenciamento de logs com compressão e retenção
A compressão é crucial para economizar espaço. Com compress, logs rotacionados são compactados com gzip. delaycompress é útil quando você precisa que o log mais recente permaneça descompactado por mais tempo.
Exemplo prático para uma aplicação web que gera logs de acesso e erro:
/var/log/minhaweb/access.log /var/log/minhaweb/error.log {
weekly
rotate 4
maxage 30
compress
delaycompress
missingok
notifempty
dateext
dateformat -%Y%m%d
}
Aqui:
- maxage 30: remove logs com mais de 30 dias, independentemente do número de rotações
- dateext: adiciona data ao nome do arquivo rotacionado
- dateformat: personaliza o formato da data
5. Pós-rotação: scripts e notificações para aplicações customizadas
Muitas aplicações precisam ser notificadas após a rotação para reabrir seus arquivos de log. O bloco postrotate permite executar scripts:
/var/log/minhaapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
postrotate
# Envia sinal HUP para a aplicação reabrir os logs
kill -HUP $(cat /var/run/minhaapp.pid 2>/dev/null) 2>/dev/null || true
endscript
}
Para serviços gerenciados pelo systemd:
/var/log/minhaapp/*.log {
daily
rotate 7
compress
postrotate
systemctl reload minhaapp.service || true
endscript
}
6. Logrotate em ambientes com múltiplas instâncias e padrões complexos
Quando você tem múltiplas instâncias de uma aplicação, curingas e diretórios aninhados são seus aliados:
/var/log/microservicos/*/app.log {
daily
rotate 30
compress
missingok
notifempty
sharedscripts
postrotate
# Script executado apenas uma vez para todos os logs
for pidfile in /var/run/microservicos/*/pid; do
if [ -f "$pidfile" ]; then
kill -HUP $(cat "$pidfile") 2>/dev/null || true
fi
done
endscript
}
O parâmetro sharedscripts garante que o script postrotate seja executado apenas uma vez, mesmo que múltiplos arquivos correspondam ao padrão.
Para logs com nomes dinâmicos, use olddir para mover logs rotacionados para um diretório separado:
/var/log/minhaapp/*.log {
daily
rotate 7
compress
olddir /var/log/minhaapp/old
dateext
dateformat -%Y%m%d-%s
}
7. Testes, depuração e boas práticas
Antes de colocar em produção, teste suas configurações:
# Modo debug (não executa, apenas mostra o que faria)
logrotate -d /etc/logrotate.d/minhaapp
# Forçar execução imediata
logrotate -f /etc/logrotate.d/minhaapp
# Verificar status das últimas rotações
cat /var/lib/logrotate/status | grep minhaapp
Boas práticas importantes:
- Permissões corretas: Use create para garantir que novos logs tenham o proprietário e permissões adequados
- Evitar loops: Não configure rotação para logs do próprio logrotate
- Monitoramento: Adicione alertas se logs não forem rotacionados por muito tempo
- Usuário específico: Em ambientes restritos, use a diretiva su para executar como um usuário não-root
8. Casos reais e resolução de problemas comuns
Exemplo completo para uma aplicação Node.js
/var/log/nodeapp/*.log {
daily
rotate 7
size 50M
compress
delaycompress
missingok
notifempty
create 0640 nodeuser nodegroup
su nodeuser nodegroup
postrotate
kill -USR2 $(cat /var/run/nodeapp.pid 2>/dev/null) 2>/dev/null || true
endscript
}
Problemas frequentes e soluções
Logs não rotacionam: Verifique permissões do diretório e arquivos. Use logrotate -d para depurar.
Permissões negadas: Adicione su usuario grupo para executar a rotação como o usuário da aplicação.
Scripts falham: Teste o script manualmente. Use || true no final para evitar que falhas interrompam a rotação.
Aplicação não reabre logs: Certifique-se de que a aplicação trata o sinal adequadamente. Para aplicações que não suportam sinais, use copytruncate:
/var/log/legacyapp/*.log {
daily
rotate 7
copytruncate
compress
}
copytruncate copia o log e trunca o original, permitindo que a aplicação continue escrevendo sem precisar reabrir o arquivo. Use com cuidado, pois pode perder algumas linhas de log entre a cópia e o truncamento.
Referências
- Documentação oficial do logrotate (man page) — Referência completa de todos os parâmetros e opções de configuração do logrotate
- Guia prático de logrotate no DigitalOcean — Tutorial passo a passo com exemplos para Ubuntu e Debian
- Configuração de logrotate para aplicações Node.js — Guia específico para configurar rotação de logs em aplicações Node.js
- Gerenciamento de logs com logrotate no Red Hat — Documentação oficial Red Hat com exemplos avançados
- Artigo sobre logrotate no Linux Journal — Artigo técnico aprofundado sobre estratégias de gerenciamento de logs com logrotate
- Solução de problemas comuns do logrotate — Guia de troubleshooting com problemas frequentes e soluções práticas
- Configuração de logrotate para aplicações Python com Flask/Django — Exemplo de como integrar logrotate com frameworks Python populares