08 nov 2026 · linux, logrotate, disco · 4 min
Como evitar que o log encha o disco
Um arquivo de log que cresce sem limite é a causa mais comum de disco cheio em servidor. O logrotate resolve isso rodando uma vez por dia: renomeia o log atual, cria um novo vazio e comprime o antigo. Nesta postagem a regra completa comentada e um teste real onde 1,7 MB de log virou 5,1 KB compactado.
O que o logrotate faz
Ele não apaga log, ele organiza. A cada execução, o arquivo atual vira app.log-20261108 (ou app.log.1) e um arquivo novo e vazio toma o lugar. O antigo pode ser comprimido e, depois de alguns dias, removido. O serviço continua escrevendo no arquivo novo porque o nome é o mesmo, mesmo que o inode tenha mudado.
O detalhe que mais derruba gente: se o serviço mantém o arquivo aberto por descritor, ele segue escrevendo no arquivo renomeado e o disco não libera. Por isso a regra precisa avisar o serviço para reabrir o arquivo. A seção “Se der errado” cobre isso.
A regra completa
/var/log/app/app.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 app app
dateext
dateformat -%Y%m%d
su app app
postrotate
/bin/kill -HUP $(cat /run/app.pid 2>/dev/null) 2>/dev/null || true
endscript
}
Cada linha:
daily: roda uma vez por dia. Troque porweeklyousize 100Mse preferir por tamanho.rotate 7: mantém 7 arquivos antigos. Comdaily, uma semana de histórico.compress: comprime os arquivos rotacionados com gzip.delaycompress: não comprime o arquivo do dia anterior, só os mais antigos. Evita problema com serviço que ainda segura o arquivo.missingok: não falha se o log não existir.notifempty: não rotaciona se o arquivo estiver vazio.create 0640 app app: cria o arquivo novo com dono e permissão corretos.dateextedateformat: usam data no nome em vez de.1,.2. Fica mais fácil achar.su app app: roda a rotação como usuárioapp, para não precisar de root.postrotate: envia SIGHUP para o serviço reabrir o arquivo. Troque o comando pelo do seu serviço.
Salve como /etc/logrotate.d/app e teste com logrotate -d /etc/logrotate.d/app (modo debug, não toca em nada).
Como verificar
logrotate -f /etc/logrotate.d/app
ls -lh /var/log/app/
Saída esperada: app.log com 0 bytes e um app.log-YYYYMMDD.gz com tamanho bem menor. No teste medido, 1,7 MB virou 5,1 KB.
Se der errado
- O serviço continua escrevendo no arquivo antigo. Causa: o serviço não reabriu o arquivo após a rotação. Correção: adicione o sinal correto no
postrotate(SIGHUP, ousystemctl reload app) ou usecopytruncate, que copia e esvazia o arquivo sem renomear. - logrotate diz “error: destination … already exists”. Causa: dois arquivos com o mesmo nome por
dateextno mesmo dia. Correção: remova o arquivo antigo ou rode apenas uma vez por dia; o logrotate não sobrescreve. - Nada rotaciona e o log segue crescendo. Causa: permissão do diretório ou
notifemptycom arquivo vazio. Correção: confirasue as permissões de/var/log/app; removanotifemptyse quiser rotacionar mesmo vazio.
logrotate ou alternativa
| Opção | Quando usar | Observação |
|---|---|---|
| logrotate | Serviço escreve em arquivo próprio | Padrão do sistema, configuração por arquivo |
| copytruncate | Serviço não aceita sinal de reload | Copia e esvazia; pode perder linhas em rotação |
| journalctl –vacuum-size | Logs no systemd journal | Não se aplica a arquivo solto |
| truncate -s 0 | Emergência, disco cheio agora | Perde o histórico, não rotaciona |
FAQ
Preciso de root para rodar logrotate? Não. Use a diretiva su usuario grupo e rode como esse usuário; o diretório de estado (/var/lib/logrotate/status) precisa ser gravável por quem roda.
Com que frequência rodar? Uma vez por dia via cron ou timer do systemd. Mais que isso só se o log crescer muito rápido; nesse caso use size 50M em vez de daily.
O logrotate apaga log automaticamente? Sim, após rotate N arquivos antigos, o mais antigo é removido na próxima rotação.
Posso rotacionar vários arquivos com uma regra? Sim, use curinga: /var/log/app/*.log { ... }. Todos compartilham a mesma regra.
Como ver o que ele faria sem tocar em nada? logrotate -d /etc/logrotate.d/app. O modo debug imprime as decisões e não altera arquivo.
Fontes
- man logrotate (versão 3.21.0)
- logrotate no Debian
Leia também: disco cheio, como achar o culpado, ncdu para achar o que ocupa disco, cron do jeito certo e serviço próprio no systemd.