LOGROTATE — GERENCIAMENTO DO CICLO DE VIDA DE LOGS Log Crescente access.log 2.4 GB Disco: 95% logrotate Rotacionar Comprimir Purgar antigos Sinalizar app Arquivos Rotacionados access.log (novo) access.log.1.gz 120K access.log.2.gz 115K access.log.3.gz 118K Disco: 12% Temporizador systemd logrotate.timer Execucao diaria Config /etc/logrotate.conf /etc/logrotate.d/ Regras por app Ciclo de vida automatizado: rotacionar, comprimir, purgar, repetir

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 grep e awk tornam-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:

  1. Um temporizador do systemd aciona o logrotate diariamente — Em sistemas Ubuntu modernos, a unidade logrotate.timer executa logrotate.service uma vez por dia. Em sistemas mais antigos, um trabalho cron em /etc/cron.daily/logrotate cuidava disso.

  2. O logrotate le sua configuracao — Ele carrega /etc/logrotate.conf (a configuracao global), que inclui todos os arquivos em /etc/logrotate.d/.

  3. 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.

  4. A rotacao acontece — O arquivo de log atual e renomeado (por exemplo, access.log torna-se access.log.1), e um novo arquivo vazio e criado. Arquivos rotacionados anteriores sao renumerados (access.log.1 torna-se access.log.2, etc.).

  5. A compressao e executada — Arquivos rotacionados sao comprimidos (tipicamente com gzip), com delaycompress esperando um ciclo antes de comprimir.

  6. Scripts pos-rotacao sao executados — Comandos dentro de blocos postrotate/endscript sao 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 .log no diretorio de logs do Nginx
  • daily — Rotaciona todos os dias (substitui o weekly global)
  • rotate 14 — Mantem duas semanas de logs rotacionados
  • delaycompress — Nao comprime o log de ontem imediatamente; isso permite que ferramentas de analise o processem primeiro
  • create 0640 www-data adm — O novo arquivo de log sera de propriedade de www-data com grupo adm, e permissoes 0640
  • sharedscripts — Executa o script postrotate apenas uma vez, mesmo que multiplos arquivos de log correspondam ao padrao glob
  • postrotate — Envia o sinal USR1 para o Nginx, que o instrui a reabrir seus arquivos de log sem reiniciar

Importante: O sinal USR1 e 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:

  • copytruncate vs create — Se sua aplicacao nao pode reabrir seus arquivos de log (muitas aplicacoes Node.js e Python mantem o descritor de arquivo aberto), use copytruncate. 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 30 com maxage 90 — Mantem 30 arquivos rotacionados, mas tambem exclui qualquer coisa mais antiga que 90 dias. A diretiva maxage fornece uma rede de seguranca.

  • dateext — Usa nomes baseados em data como app.log-20260114.gz em vez de nomes numericos como app.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 || true ou ; true para evitar que falhas do script interrompam o logrotate
  • Use sharedscripts quando 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:

  • size substitui a rotacao baseada em tempo completamente — o logrotate so verifica o tamanho do arquivo
  • maxsize funciona junto com a rotacao baseada em tempo — rotaciona no cronograma OU quando o tamanho e excedido, o que acontecer primeiro
  • minsize impede 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

DiretivaDescricaoExemplo
dailyRotaciona arquivos de log todos os diasdaily
weeklyRotaciona arquivos de log uma vez por semanaweekly
monthlyRotaciona arquivos de log uma vez por mesmonthly
rotate NMantem N arquivos rotacionados antes de excluirrotate 7
compressComprime arquivos rotacionados com gzipcompress
delaycompressAtrasa a compressao por um ciclo de rotacaodelaycompress
missingokNao gera erro se o arquivo de log estiver ausentemissingok
notifemptyNao rotaciona se o arquivo de log estiver vazionotifempty
create mode owner groupCria novo arquivo de log com atributos especificadoscreate 0640 www-data adm
copytruncateCopia o log e depois trunca o originalcopytruncate
size NRotaciona quando o arquivo excede N bytes/KB/MBsize 100M
maxsize NRotaciona no cronograma ou quando tamanho excede Nmaxsize 500M
minsize NSo rotaciona se o arquivo tiver pelo menos tamanho Nminsize 1M
maxage NRemove arquivos rotacionados mais antigos que N diasmaxage 90
dateextUsa sufixos baseados em data para arquivos rotacionadosdateext
sharedscriptsExecuta scripts postrotate apenas uma vez para todos os arquivos correspondentessharedscripts
postrotate/endscriptComandos shell para executar apos a rotacaoVer exemplos acima
prerotate/endscriptComandos shell para executar antes da rotacaoVer exemplos acima
olddir /caminhoMove arquivos rotacionados para um diretorio diferenteolddir /var/log/archive
su user groupExecuta a rotacao como um usuario e grupo especificosu 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.conf define os padroes; as configuracoes por aplicacao em /etc/logrotate.d/ os substituem
  • Use daily com compress e rotate 14 como ponto de partida sensato para a maioria dos servicos
  • Sempre use scripts postrotate para sinalizar aplicacoes a reabrir seus arquivos de log
  • Teste cada configuracao com logrotate -d antes de implementa-la
  • Use copytruncate para aplicacoes que nao conseguem reabrir seus arquivos de log
  • Combine daily com maxsize para 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.