TL;DR — Resumo Rápido
Logrotate automatiza a rotação de logs no Linux. Aprenda diretivas essenciais, scripts postrotate, rotação por tamanho e como testar sua configuração.
Gerenciar arquivos de log no Linux é uma tarefa operacional rotineira que, quando negligenciada, leva a discos cheios, desempenho degradado e serviços com falha. Logrotate é a ferramenta padrão para automatizar a rotação, compressão e limpeza de logs em praticamente todas as distribuições Linux. Este guia cobre tudo, desde a configuração global até exemplos por aplicação, estratégias de teste e solução de problemas reais.
Pré-requisitos
- Servidor Linux com Ubuntu, Debian, RHEL ou distribuição compatível.
logrotateinstalado (apt install logrotateouyum install logrotate).- Familiaridade básica com a linha de comando e gerenciamento de serviços via
systemctl. - Acesso root ou sudo para editar
/etc/logrotate.confe/etc/logrotate.d/.
Como o Logrotate Funciona
O logrotate não executa como daemon. Ele é invocado diariamente pela entrada cron em /etc/cron.daily/logrotate. A cada execução, lê sua configuração, consulta o arquivo de estado em /var/lib/logrotate/status para saber quando cada log foi rotacionado pela última vez, e age apenas quando o intervalo programado tiver decorrido.
# Verificar o arquivo de estado manualmente
cat /var/lib/logrotate/status
O arquivo de estado contém entradas como:
"/var/log/nginx/access.log" 2026-3-21-6:0:0
"/var/log/syslog" 2026-3-22-6:0:0
Se este arquivo for corrompido ou excluído, o logrotate rotacionará todos os logs na próxima execução como se nunca tivessem sido rotacionados.
Config Global vs Configs por Aplicação
/etc/logrotate.conf — Padrões Globais
Este arquivo define os padrões herdados por todas as configurações:
# Rotacionar semanalmente por padrão
weekly
# Manter 4 rotações
rotate 4
# Comprimir logs rotacionados
compress
# Carregar configs por aplicação
include /etc/logrotate.d
/etc/logrotate.d/ — Sobrescritas por Aplicação
Cada arquivo neste diretório configura a rotação de uma aplicação:
/var/log/nginx/access.log /var/log/nginx/error.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
postrotate
systemctl reload nginx
endscript
}
Diretivas Principais
| Diretiva | Efeito |
|---|---|
daily / weekly / monthly | Frequência de rotação |
rotate N | Número de arquivos rotacionados a manter antes de excluir |
compress | Comprimir arquivos rotacionados com gzip |
delaycompress | Comprimir a rotação anterior, não a recém-rotacionada |
missingok | Ignorar silenciosamente se o arquivo de log não existir |
notifempty | Não rotacionar se o log estiver vazio |
create modo dono grupo | Criar novo log vazio com essas permissões após rotação |
sharedscripts | Executar postrotate uma vez para todos os arquivos correspondentes |
dateext | Adicionar data em vez de número ao nome do arquivo rotacionado |
size N / minsize N / maxsize N | Acionar rotação baseada no tamanho do arquivo |
copytruncate vs postrotate
postrotate / endscript (recomendado)
Após o logrotate renomear o arquivo de log, o bloco postrotate executa um comando que instrui a aplicação a fechar o descritor antigo e abrir o novo arquivo vazio:
postrotate
systemctl reload nginx
# ou para processos que usam SIGUSR1:
kill -USR1 $(cat /var/run/gunicorn.pid) 2>/dev/null || true
endscript
copytruncate
Algumas aplicações não conseguem recarregar descritores de arquivo. copytruncate instrui o logrotate a copiar o arquivo para o nome rotacionado e então truncar o original para zero bytes:
/var/log/meuapp/app.log {
daily
rotate 7
compress
delaycompress
copytruncate
}
Atenção: Existe uma pequena janela entre a cópia e o truncamento onde novas linhas de log podem ser gravadas no arquivo original e perdidas do arquivo rotacionado. Para logs de alto volume, prefira postrotate sempre que possível.
Rotação Baseada em Tamanho
/var/log/meuapp/app.log {
# Rotacionar quando o arquivo ultrapassar 100 MB independente do horário
size 100M
# Rotacionar quando o arquivo tiver pelo menos 10 MB E o intervalo tiver decorrido
# minsize 10M
# Rotacionar quando ultrapassar 500 MB mesmo que o intervalo não tenha decorrido
# maxsize 500M
rotate 10
compress
delaycompress
missingok
notifempty
}
Exemplos por Aplicação
Nginx
/var/log/nginx/*.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
create 0640 www-data adm
sharedscripts
postrotate
nginx -s reopen
endscript
}
Docker
/var/lib/docker/containers/*/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
copytruncate
}
A solução preferida é configurar o daemon Docker com "log-opts": {"max-size": "100m", "max-file": "5"} em /etc/docker/daemon.json.
Logs de Aplicação em /var/log/meuapp/
/var/log/meuapp/*.log {
daily
rotate 14
size 50M
compress
delaycompress
missingok
notifempty
create 0640 meuapp meuapp
sharedscripts
postrotate
systemctl reload meuapp 2>/dev/null || true
endscript
}
Nomes de Arquivo com Data (dateext)
Por padrão, o logrotate adiciona sufixos numéricos: access.log.1, access.log.2.gz. Ative dateext para nomes com data legíveis:
/var/log/nginx/*.log {
daily
rotate 30
dateext
dateformat -%Y-%m-%d
compress
delaycompress
missingok
}
Isso produz nomes como access.log-2026-03-22.gz.
Testando sua Configuração
Simulação (Seguro)
sudo logrotate -d /etc/logrotate.d/nginx
Forçar Rotação
sudo logrotate -f /etc/logrotate.d/nginx
Modo Verbose
sudo logrotate -v /etc/logrotate.conf
Solução de Problemas
| Problema | Causa | Solução |
|---|---|---|
| Rotação ocorre mas logs continuam crescendo | notifempty ignorando logs vazios, ou app não respeitando reload | Verifique se o log tem conteúdo; confirme que o app reabra arquivos com systemctl reload |
| Permissões inseguras no diretório pai | logrotate recusa diretórios com escrita para todos | Corrija permissões: chmod o-w /var/log/meuapp |
| Arquivos rotacionados sem compressão | Falta compress, ou uso sem delaycompress | Adicione delaycompress para comprimir no próximo ciclo |
| SELinux bloqueando rotação | Contexto SELinux incorreto nos arquivos rotacionados | Execute restorecon -v /var/log/meuapp/*.log |
| Corrupção do arquivo de estado | Edições manuais ou erros no sistema de arquivos | Exclua /var/lib/logrotate/status — o logrotate o recria automaticamente |
Script postrotate falha silenciosamente | Código de saída diferente de zero | Adicione ` |
Comparativo: Logrotate vs Outras Abordagens
| Ferramenta | Mecanismo | Ideal Para |
|---|---|---|
| logrotate | Rotação de arquivos acionada por cron com regras configuráveis | Arquivos de log tradicionais em /var/log/ |
| systemd-journald | Journal binário com limites SystemMaxUse e MaxFileSec | Entradas de journal de serviços systemd |
| rsyslog integrado | Módulo om file com diretivas de rotação | Ambientes com encaminhamento centralizado via rsyslog |
| Drivers do Docker | Driver json-file com max-size e max-file | Logs de stdout/stderr de contêineres |
| Fluentd / Vector | Envio para armazenamento remoto; sem rotação local | Ambientes cloud-native com agregação centralizada |
Resumo
- O logrotate é executado diariamente via
/etc/cron.daily/logrotatee usa/var/lib/logrotate/statuspara rastrear os tempos de rotação. - Os padrões globais estão em
/etc/logrotate.conf; as configs por app vão em/etc/logrotate.d/. - Use
postrotatecomsystemctl reloadoukill -USR1sempre que possível — prefira-o aocopytruncate. - Adicione
delaycompressjunto comcompresspara não comprimir arquivos ainda abertos por processos em execução. - Use
size,minsizeoumaxsizepara serviços que possam gerar logs volumosos inesperadamente. - Sempre teste com
logrotate -dantes de implantar uma nova configuração em produção. - Nomes com data (
dateext) facilitam muito o gerenciamento e auditoria de logs.