Arquivos de log crescem silenciosamente em segundo plano de cada servidor Linux. Servidores web, frameworks de aplicacoes, bancos de dados e daemons do sistema escrevem em arquivos de log continuamente. Sem controle, esses arquivos consumirao todo o espaco disponivel em disco, eventualmente causando interrupcoes de servico, falhas de escrita e desempenho degradado. O logrotate e o utilitario padrao no Linux que resolve esse problema rotacionando, comprimindo e removendo automaticamente arquivos de log antigos em um cronograma que voce define.
Este guia cobre tudo o que voce precisa para configurar o logrotate de forma eficaz: a configuracao global, configuracoes por aplicacao, configuracoes especificas para Nginx, scripts pos-rotacao e como solucionar problemas quando algo da errado.
Pre-requisitos
Antes de comecar, certifique-se de ter:
- Um servidor Linux rodando Ubuntu 20.04, 22.04 ou 24.04 (as instrucoes tambem se aplicam ao Debian e a maioria das distribuicoes baseadas em RHEL)
- Acesso ao terminal com privilegios sudo
- Familiaridade basica com a linha de comando e edicao de texto (nano ou vim)
- Arquivos de log que precisam de gerenciamento (servidor web, aplicacao ou logs do sistema)
O Que e Logrotate?
Logrotate e um utilitario do sistema projetado para simplificar a administracao de arquivos de log. Ele automatiza a rotacao, compressao e exclusao de arquivos de log para que eles nao encham seu sistema de arquivos. O logrotate vem pre-instalado em praticamente todas as distribuicoes Linux e tem sido a ferramenta padrao de gerenciamento de logs por decadas.
O que o logrotate faz:
- Rotaciona arquivos de log renomeando-os com um sufixo numerico ou carimbo de data
- Comprime arquivos de log antigos usando gzip (ou outros algoritmos) para economizar espaco em disco
- Remove arquivos de log mais antigos que um numero especificado de rotacoes
- Sinaliza aplicacoes para reabrir seus arquivos de log apos a rotacao
- Executa scripts personalizados antes ou depois da rotacao
# Verify logrotate is installed
logrotate --version
# Expected output:
# logrotate 3.21.0
Por Que a Rotacao de Logs e Importante?
Sem rotacao de logs, um servidor Nginx movimentado gerando 50.000 requisicoes por dia pode produzir logs de acesso que crescem centenas de megabytes diariamente. Em semanas ou meses, esses arquivos se inflam para gigabytes. As consequencias sao previsiveis:
- Disco cheio — servicos travam quando o sistema de arquivos atinge 100% de capacidade
- Analise lenta de logs — ferramentas como
grepeawktornam-se impraticas em arquivos de multiplos gigabytes - Backups inflados — logs nao comprimidos inflam os tamanhos de backup e tempos de transferencia
- Risco de conformidade — algumas regulamentacoes exigem politicas de retencao de logs com cronogramas de purga definidos
Uma configuracao simples de logrotate previne todos esses problemas com zero esforco continuo.
Como o Logrotate Funciona
O logrotate segue um fluxo de execucao direto:
-
Um temporizador do systemd aciona o logrotate diariamente — Em sistemas Ubuntu modernos, a unidade
logrotate.timerexecutalogrotate.serviceuma vez por dia. Em sistemas mais antigos, um trabalho cron em/etc/cron.daily/logrotatecuidava disso. -
O logrotate le sua configuracao — Ele carrega
/etc/logrotate.conf(a configuracao global), que inclui todos os arquivos em/etc/logrotate.d/. -
Ele verifica cada arquivo de log contra suas regras — Com base nas diretivas (daily, size, etc.), o logrotate determina se cada arquivo de log precisa de rotacao.
-
A rotacao acontece — O arquivo de log atual e renomeado (por exemplo,
access.logtorna-seaccess.log.1), e um novo arquivo vazio e criado. Arquivos rotacionados anteriores sao renumerados (access.log.1torna-seaccess.log.2, etc.). -
A compressao e executada — Arquivos rotacionados sao comprimidos (tipicamente com gzip), com
delaycompressesperando um ciclo antes de comprimir. -
Scripts pos-rotacao sao executados — Comandos dentro de blocos
postrotate/endscriptsao executados, tipicamente enviando um sinal para a aplicacao reabrir seu arquivo de log.
Verifique se o temporizador esta ativo:
# Check the systemd timer
systemctl status logrotate.timer
# See when it last ran and when it will run next
systemctl list-timers logrotate
Configuracao Global (/etc/logrotate.conf)
O arquivo de configuracao global define diretivas padrao que se aplicam a todos os arquivos de log, a menos que sejam substituidas por configuracoes especificas de aplicacao.
# View the global configuration
cat /etc/logrotate.conf
Uma configuracao padrao tipica se parece com isto:
# /etc/logrotate.conf
# Rotate log files weekly
weekly
# Keep 4 weeks of rotated logs
rotate 4
# Create new (empty) log files after rotating old ones
create
# Use date as a suffix of the rotated file
dateext
# Compress rotated log files
compress
# Packages drop their config snippets into this directory
include /etc/logrotate.d
Pontos-chave sobre a configuracao global:
weekly— Rotaciona os logs uma vez por semana. Este e o cronograma padrao.rotate 4— Mantem 4 arquivos rotacionados antes de excluir o mais antigo. Com rotacao semanal, isso mantem um mes de logs.create— Apos rotacionar, cria um novo arquivo de log vazio com as mesmas permissoes do original.dateext— Adiciona a data (por exemplo,-20260114) em vez de um sufixo numerico aos arquivos rotacionados.compress— Comprime os arquivos rotacionados com gzip.include /etc/logrotate.d— Carrega todos os arquivos de configuracao especificos de aplicacao deste diretorio.
Configuracoes Especificas por Aplicacao (/etc/logrotate.d/)
Cada aplicacao pode ter seu proprio arquivo de configuracao de logrotate em /etc/logrotate.d/. Esses arquivos substituem os padroes globais para arquivos de log especificos.
# List all application-specific configs
ls -la /etc/logrotate.d/
# Common files you might see:
# apt dpkg nginx rsyslog
# alternatives cups samba ufw
Cada arquivo segue o mesmo formato: um caminho de arquivo de log (ou padrao glob), seguido de diretivas entre chaves.
# Example: /etc/logrotate.d/rsyslog
/var/log/syslog
/var/log/mail.info
/var/log/mail.warn
/var/log/mail.err
/var/log/mail.log
/var/log/daemon.log
/var/log/kern.log
/var/log/auth.log
/var/log/user.log
/var/log/cron.log
{
rotate 4
weekly
missingok
notifempty
compress
delaycompress
sharedscripts
postrotate
/usr/lib/rsyslog/rsyslog-rotate
endscript
}
Diretivas de Configuracao Explicadas
O logrotate oferece dezenas de diretivas para controlar exatamente como a rotacao se comporta. Aqui estao as mais importantes:
Frequencia de Rotacao
daily # Rotate every day
weekly # Rotate once per week (default)
monthly # Rotate once per month
yearly # Rotate once per year
Retencao
rotate 7 # Keep 7 rotated files before deleting the oldest
maxage 30 # Remove rotated logs older than 30 days
Compressao
compress # Compress rotated files (gzip by default)
delaycompress # Wait one rotation cycle before compressing
compresscmd /usr/bin/xz # Use xz instead of gzip
compressoptions "-9" # Pass options to the compression command
nocompress # Do not compress rotated files
Manipulacao de Arquivos
missingok # Do not error if the log file is missing
notifempty # Do not rotate the log if it is empty
create 0640 www-data adm # Create new file with specific mode, owner, group
copytruncate # Copy the log and truncate the original (for apps that hold the file open)
Nomenclatura
dateext # Use date-based suffixes (-20260114)
dateformat -%Y%m%d # Customize the date format
extension .log # Preserve the .log extension after the date suffix
Configuracao Personalizada para Nginx
O Nginx e um dos servicos mais comuns que requer uma configuracao de logrotate. Quando o Nginx e instalado a partir dos pacotes oficiais, ele geralmente inclui um arquivo de configuracao, mas voce pode precisar personaliza-lo.
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
rotate 14
missingok
notifempty
compress
delaycompress
create 0640 www-data adm
sharedscripts
postrotate
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
O que cada diretiva faz neste contexto:
/var/log/nginx/*.log— Aplica essas regras a todos os arquivos.logno diretorio de logs do Nginxdaily— Rotaciona todos os dias (substitui oweeklyglobal)rotate 14— Mantem duas semanas de logs rotacionadosdelaycompress— Nao comprime o log de ontem imediatamente; isso permite que ferramentas de analise o processem primeirocreate 0640 www-data adm— O novo arquivo de log sera de propriedade dewww-datacom grupoadm, e permissoes0640sharedscripts— Executa o script postrotate apenas uma vez, mesmo que multiplos arquivos de log correspondam ao padrao globpostrotate— Envia o sinalUSR1para o Nginx, que o instrui a reabrir seus arquivos de log sem reiniciar
Importante: O sinal
USR1e especifico do Nginx. Outras aplicacoes usam sinais diferentes ou requerem um reinicio completo. Sempre consulte a documentacao do seu servico especifico.
Configuracao Personalizada para Logs de Aplicacoes
Para logs de aplicacoes personalizadas (Rails, Node.js, Django, ou qualquer aplicacao que escreva seus proprios logs), voce precisa criar uma configuracao de logrotate do zero.
# /etc/logrotate.d/myapp
/var/log/myapp/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
copytruncate
dateext
dateformat -%Y%m%d
maxage 90
}
Decisoes-chave para logs de aplicacoes:
-
copytruncatevscreate— Se sua aplicacao nao pode reabrir seus arquivos de log (muitas aplicacoes Node.js e Python mantem o descritor de arquivo aberto), usecopytruncate. Isso copia o conteudo para um arquivo rotacionado e depois trunca o original. Ha uma pequena janela onde linhas de log podem ser perdidas entre a copia e o truncamento, mas para a maioria das aplicacoes isso e aceitavel. -
rotate 30commaxage 90— Mantem 30 arquivos rotacionados, mas tambem exclui qualquer coisa mais antiga que 90 dias. A diretivamaxagefornece uma rede de seguranca. -
dateext— Usa nomes baseados em data comoapp.log-20260114.gzem vez de nomes numericos comoapp.log.1.gz. Isso facilita encontrar logs de uma data especifica.
Se sua aplicacao suporta reabertura de logs baseada em sinais:
# /etc/logrotate.d/myapp-with-signal
/var/log/myapp/*.log {
daily
rotate 30
missingok
notifempty
compress
delaycompress
create 0644 appuser appgroup
sharedscripts
postrotate
systemctl kill --signal=HUP myapp.service
endscript
}
Scripts Pos-Rotacao (postrotate/endscript)
Scripts pos-rotacao sao blocos de comandos shell que executam apos a rotacao de logs ser concluida. Eles sao essenciais para sinalizar aplicacoes a reabrir seus arquivos de log.
postrotate
# This block runs after rotation
/usr/bin/systemctl reload nginx > /dev/null 2>&1 || true
endscript
Tambem existem scripts prerotate que executam antes da rotacao:
prerotate
# This block runs before rotation
if [ -d /etc/logrotate.d/httpd-prerotate ]; then
run-parts /etc/logrotate.d/httpd-prerotate
fi
endscript
Regras importantes para scripts de rotacao:
- Sempre termine com
|| trueou; truepara evitar que falhas do script interrompam o logrotate - Use
sharedscriptsquando o caminho do log contiver um padrao glob — isso garante que o bloco postrotate execute apenas uma vez em vez de uma vez por arquivo correspondente - Mantenha os scripts minimos e rapidos — o logrotate bloqueia enquanto os scripts executam
- Teste os scripts manualmente antes de adiciona-los a uma configuracao de logrotate
Padroes comuns de sinais para servicos populares:
# Nginx -- reopen log files
kill -USR1 $(cat /var/run/nginx.pid)
# Apache -- graceful restart
/usr/sbin/apachectl graceful > /dev/null 2>&1
# rsyslog -- reopen log files
/usr/lib/rsyslog/rsyslog-rotate
# systemd service -- generic signal
systemctl kill --signal=HUP myservice.service
Testes e Depuracao
Sempre teste suas configuracoes de logrotate antes de esperar que o temporizador diario as acione.
Modo de Depuracao (Execucao Simulada)
O modo de depuracao simula a rotacao sem fazer nenhuma alteracao. Ele mostra exatamente o que o logrotate faria:
# Test a specific config file
sudo logrotate -d /etc/logrotate.d/nginx
# Test the entire configuration
sudo logrotate -d /etc/logrotate.conf
Exemplo de saida de depuracao:
reading config file /etc/logrotate.d/nginx
Handling 1 logs
rotating pattern: /var/log/nginx/*.log after 1 days (14 rotations)
empty log files are not rotated, old logs are removed
considering log /var/log/nginx/access.log
Now: 2026-01-14 10:00
Last rotated at 2026-01-13 06:00
log needs rotating
considering log /var/log/nginx/error.log
Now: 2026-01-14 10:00
Last rotated at 2026-01-13 06:00
log needs rotating
Forcar Rotacao
Force uma rotacao imediata independentemente do cronograma:
# Force rotation for a specific config
sudo logrotate -f /etc/logrotate.d/nginx
# Force rotation with verbose output
sudo logrotate -vf /etc/logrotate.d/nginx
Verificando o Arquivo de Estado
O logrotate rastreia quando cada arquivo de log foi rotacionado pela ultima vez em um arquivo de estado:
# View the state file
cat /var/lib/logrotate/status
# You'll see entries like:
# "/var/log/nginx/access.log" 2026-1-14-6:0:0
# "/var/log/nginx/error.log" 2026-1-14-6:0:0
# "/var/log/syslog" 2026-1-13-6:0:0
Se o logrotate nao esta rotacionando um arquivo que voce espera que rotacione, verifique este arquivo de estado. Se a data da ultima rotacao e recente, o logrotate pulara o arquivo ate que o proximo intervalo de rotacao passe.
Rotacao Baseada em Tamanho vs Baseada em Tempo
O logrotate suporta tanto rotacao baseada em tempo quanto baseada em tamanho, e voce pode combina-las.
Apenas Baseada em Tempo
/var/log/myapp/*.log {
daily # Rotate every day regardless of file size
rotate 7
compress
}
Apenas Baseada em Tamanho
/var/log/myapp/*.log {
size 100M # Rotate only when the file exceeds 100 MB
rotate 5
compress
}
Combinada: Baseada em Tempo com Limites de Tamanho
/var/log/myapp/*.log {
daily
rotate 14
compress
maxsize 200M # Also rotate if file exceeds 200 MB before the daily schedule
minsize 1M # Do not rotate if the file is smaller than 1 MB, even on schedule
}
Diferencas-chave:
sizesubstitui a rotacao baseada em tempo completamente — o logrotate so verifica o tamanho do arquivomaxsizefunciona junto com a rotacao baseada em tempo — rotaciona no cronograma OU quando o tamanho e excedido, o que acontecer primeirominsizeimpede a rotacao de arquivos de log pequenos — o log deve ter pelo menos este tamanho E o intervalo de tempo deve ter passado
Para servidores de alto trafego, a combinacao de daily com maxsize fornece o melhor equilibrio entre cronogramas previsiveis e protecao do espaco em disco.
Tabela de Referencia de Diretivas do Logrotate
| Diretiva | Descricao | Exemplo |
|---|---|---|
daily | Rotaciona arquivos de log todos os dias | daily |
weekly | Rotaciona arquivos de log uma vez por semana | weekly |
monthly | Rotaciona arquivos de log uma vez por mes | monthly |
rotate N | Mantem N arquivos rotacionados antes de excluir | rotate 7 |
compress | Comprime arquivos rotacionados com gzip | compress |
delaycompress | Atrasa a compressao por um ciclo de rotacao | delaycompress |
missingok | Nao gera erro se o arquivo de log estiver ausente | missingok |
notifempty | Nao rotaciona se o arquivo de log estiver vazio | notifempty |
create mode owner group | Cria novo arquivo de log com atributos especificados | create 0640 www-data adm |
copytruncate | Copia o log e depois trunca o original | copytruncate |
size N | Rotaciona quando o arquivo excede N bytes/KB/MB | size 100M |
maxsize N | Rotaciona no cronograma ou quando tamanho excede N | maxsize 500M |
minsize N | So rotaciona se o arquivo tiver pelo menos tamanho N | minsize 1M |
maxage N | Remove arquivos rotacionados mais antigos que N dias | maxage 90 |
dateext | Usa sufixos baseados em data para arquivos rotacionados | dateext |
sharedscripts | Executa scripts postrotate apenas uma vez para todos os arquivos correspondentes | sharedscripts |
postrotate/endscript | Comandos shell para executar apos a rotacao | Ver exemplos acima |
prerotate/endscript | Comandos shell para executar antes da rotacao | Ver exemplos acima |
olddir /caminho | Move arquivos rotacionados para um diretorio diferente | olddir /var/log/archive |
su user group | Executa a rotacao como um usuario e grupo especifico | su root adm |
Solucao de Problemas
O Logrotate Nao Esta Rotacionando um Arquivo
# 1. Check for syntax errors
sudo logrotate -d /etc/logrotate.d/yourconfig
# 2. Verify the log file path matches the glob pattern
ls -la /var/log/myapp/*.log
# 3. Check the state file for the last rotation date
grep "myapp" /var/lib/logrotate/status
# 4. Verify the timer is running
systemctl status logrotate.timer
Erros de Permissao Negada
# Check ownership and permissions of the log file
ls -la /var/log/myapp/app.log
# Check that the logrotate config uses the correct su directive
# Add this inside your config block:
su root adm
Espaco em Disco Nao e Liberado Apos a Rotacao
Se o espaco em disco nao e liberado apos a rotacao, uma aplicacao pode estar mantendo o arquivo antigo (excluido) aberto:
# Find processes holding deleted files open
sudo lsof +L1 | grep deleted
# Restart the offending service to release the file descriptor
sudo systemctl restart myapp
Este e exatamente o cenario onde copytruncate ajuda — ele trunca o arquivo no local em vez de exclui-lo, entao o descritor de arquivo permanece valido.
Corrupcao do Arquivo de Estado
Se o logrotate se comporta de forma erratica, o arquivo de estado pode estar corrompido:
# Back up the current state file
sudo cp /var/lib/logrotate/status /var/lib/logrotate/status.bak
# Remove the state file (logrotate will recreate it)
sudo rm /var/lib/logrotate/status
# Force a full rotation to rebuild state
sudo logrotate -f /etc/logrotate.conf
Logs Rotacionados Mas Nao Comprimidos
Se voce ve arquivos .1 nao comprimidos ao lado de arquivos .2.gz comprimidos, este e o comportamento esperado quando delaycompress esta habilitado. O arquivo mais recentemente rotacionado permanece nao comprimido por um ciclo. Se voce precisa de compressao imediata, remova a diretiva delaycompress.
Resumo
O logrotate e um daqueles utilitarios que trabalha silenciosamente em segundo plano ate que algo da errado — e quando da errado, geralmente significa que seu disco esta cheio. Dedicar 15 minutos para configurar o logrotate corretamente para suas aplicacoes economiza horas de limpeza de disco emergencial depois.
Os pontos-chave para lembrar:
- A configuracao global em
/etc/logrotate.confdefine os padroes; as configuracoes por aplicacao em/etc/logrotate.d/os substituem - Use
dailycomcompresserotate 14como ponto de partida sensato para a maioria dos servicos - Sempre use scripts
postrotatepara sinalizar aplicacoes a reabrir seus arquivos de log - Teste cada configuracao com
logrotate -dantes de implementa-la - Use
copytruncatepara aplicacoes que nao conseguem reabrir seus arquivos de log - Combine
dailycommaxsizepara servidores de alto trafego
Para proteger o resto do seu servidor, confira nossa Lista de Verificacao de Seguranca para Servidores Linux: 20 Passos Essenciais e o Guia Completo do Nginx como Proxy Reverso para configurar o Nginx corretamente desde o inicio.