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.
  • logrotate instalado (apt install logrotate ou yum 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.conf e /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

DiretivaEfeito
daily / weekly / monthlyFrequência de rotação
rotate NNúmero de arquivos rotacionados a manter antes de excluir
compressComprimir arquivos rotacionados com gzip
delaycompressComprimir a rotação anterior, não a recém-rotacionada
missingokIgnorar silenciosamente se o arquivo de log não existir
notifemptyNão rotacionar se o log estiver vazio
create modo dono grupoCriar novo log vazio com essas permissões após rotação
sharedscriptsExecutar postrotate uma vez para todos os arquivos correspondentes
dateextAdicionar data em vez de número ao nome do arquivo rotacionado
size N / minsize N / maxsize NAcionar 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

ProblemaCausaSolução
Rotação ocorre mas logs continuam crescendonotifempty ignorando logs vazios, ou app não respeitando reloadVerifique se o log tem conteúdo; confirme que o app reabra arquivos com systemctl reload
Permissões inseguras no diretório pailogrotate recusa diretórios com escrita para todosCorrija permissões: chmod o-w /var/log/meuapp
Arquivos rotacionados sem compressãoFalta compress, ou uso sem delaycompressAdicione delaycompress para comprimir no próximo ciclo
SELinux bloqueando rotaçãoContexto SELinux incorreto nos arquivos rotacionadosExecute restorecon -v /var/log/meuapp/*.log
Corrupção do arquivo de estadoEdições manuais ou erros no sistema de arquivosExclua /var/lib/logrotate/status — o logrotate o recria automaticamente
Script postrotate falha silenciosamenteCódigo de saída diferente de zeroAdicione `

Comparativo: Logrotate vs Outras Abordagens

FerramentaMecanismoIdeal Para
logrotateRotação de arquivos acionada por cron com regras configuráveisArquivos de log tradicionais em /var/log/
systemd-journaldJournal binário com limites SystemMaxUse e MaxFileSecEntradas de journal de serviços systemd
rsyslog integradoMódulo om file com diretivas de rotaçãoAmbientes com encaminhamento centralizado via rsyslog
Drivers do DockerDriver json-file com max-size e max-fileLogs de stdout/stderr de contêineres
Fluentd / VectorEnvio para armazenamento remoto; sem rotação localAmbientes cloud-native com agregação centralizada

Resumo

  • O logrotate é executado diariamente via /etc/cron.daily/logrotate e usa /var/lib/logrotate/status para 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 postrotate com systemctl reload ou kill -USR1 sempre que possível — prefira-o ao copytruncate.
  • Adicione delaycompress junto com compress para não comprimir arquivos ainda abertos por processos em execução.
  • Use size, minsize ou maxsize para serviços que possam gerar logs volumosos inesperadamente.
  • Sempre teste com logrotate -d antes de implantar uma nova configuração em produção.
  • Nomes com data (dateext) facilitam muito o gerenciamento e auditoria de logs.

Artigos Relacionados