Como usar o logrotate para gerenciar logs de aplicações customizadas

1. Introdução ao logrotate e sua importância

O logrotate é uma ferramenta essencial no ecossistema Linux para administradores de sistemas que precisam gerenciar arquivos de log de forma automática e eficiente. Sem ele, logs de aplicações podem crescer indefinidamente, ocupando espaço em disco, causando lentidão em operações de I/O e até mesmo levando à perda de dados críticos quando o disco fica completamente cheio.

O funcionamento básico do logrotate é simples: ele executa rotação periódica de arquivos de log, podendo compactá-los, removê-los após um período definido e até mesmo executar scripts personalizados após cada rotação. A ferramenta é executada tipicamente como uma tarefa cron diária, mas pode ser configurada para rodar em intervalos personalizados.

2. Estrutura básica de configuração do logrotate

Os arquivos de configuração do logrotate ficam em dois locais principais:
- /etc/logrotate.conf — configuração global
- /etc/logrotate.d/ — diretório com configurações específicas para cada aplicação

A sintaxe de uma diretiva básica segue este padrão:

/var/log/minhaapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
}

Parâmetros fundamentais incluem:
- rotate: número de versões antigas mantidas antes da remoção
- daily/weekly/monthly: frequência da rotação baseada em tempo
- compress: compacta logs rotacionados com gzip
- delaycompress: adia a compressão em uma rotação (útil para logs que ainda podem ser acessados)

3. Criando uma configuração personalizada para sua aplicação

Vamos criar uma configuração para uma aplicação hipotética que gera logs em /var/log/minhaapp/. O arquivo deve ser criado em /etc/logrotate.d/minhaapp:

/var/log/minhaapp/*.log {
    daily
    rotate 14
    size 100M
    missingok
    notifempty
    compress
    delaycompress
    create 0640 appuser appgroup
}

Neste exemplo:
- daily: rotação diária
- rotate 14: mantém 14 versões antigas
- size 100M: força rotação também quando o log atinge 100MB
- missingok: não gera erro se o arquivo de log não existir
- notifempty: não rotaciona logs vazios
- create: define permissões e proprietário do novo arquivo de log

4. Gerenciamento de logs com compressão e retenção

A compressão é crucial para economizar espaço. Com compress, logs rotacionados são compactados com gzip. delaycompress é útil quando você precisa que o log mais recente permaneça descompactado por mais tempo.

Exemplo prático para uma aplicação web que gera logs de acesso e erro:

/var/log/minhaweb/access.log /var/log/minhaweb/error.log {
    weekly
    rotate 4
    maxage 30
    compress
    delaycompress
    missingok
    notifempty
    dateext
    dateformat -%Y%m%d
}

Aqui:
- maxage 30: remove logs com mais de 30 dias, independentemente do número de rotações
- dateext: adiciona data ao nome do arquivo rotacionado
- dateformat: personaliza o formato da data

5. Pós-rotação: scripts e notificações para aplicações customizadas

Muitas aplicações precisam ser notificadas após a rotação para reabrir seus arquivos de log. O bloco postrotate permite executar scripts:

/var/log/minhaapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    postrotate
        # Envia sinal HUP para a aplicação reabrir os logs
        kill -HUP $(cat /var/run/minhaapp.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

Para serviços gerenciados pelo systemd:

/var/log/minhaapp/*.log {
    daily
    rotate 7
    compress
    postrotate
        systemctl reload minhaapp.service || true
    endscript
}

6. Logrotate em ambientes com múltiplas instâncias e padrões complexos

Quando você tem múltiplas instâncias de uma aplicação, curingas e diretórios aninhados são seus aliados:

/var/log/microservicos/*/app.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
    sharedscripts
    postrotate
        # Script executado apenas uma vez para todos os logs
        for pidfile in /var/run/microservicos/*/pid; do
            if [ -f "$pidfile" ]; then
                kill -HUP $(cat "$pidfile") 2>/dev/null || true
            fi
        done
    endscript
}

O parâmetro sharedscripts garante que o script postrotate seja executado apenas uma vez, mesmo que múltiplos arquivos correspondam ao padrão.

Para logs com nomes dinâmicos, use olddir para mover logs rotacionados para um diretório separado:

/var/log/minhaapp/*.log {
    daily
    rotate 7
    compress
    olddir /var/log/minhaapp/old
    dateext
    dateformat -%Y%m%d-%s
}

7. Testes, depuração e boas práticas

Antes de colocar em produção, teste suas configurações:

# Modo debug (não executa, apenas mostra o que faria)
logrotate -d /etc/logrotate.d/minhaapp

# Forçar execução imediata
logrotate -f /etc/logrotate.d/minhaapp

# Verificar status das últimas rotações
cat /var/lib/logrotate/status | grep minhaapp

Boas práticas importantes:
- Permissões corretas: Use create para garantir que novos logs tenham o proprietário e permissões adequados
- Evitar loops: Não configure rotação para logs do próprio logrotate
- Monitoramento: Adicione alertas se logs não forem rotacionados por muito tempo
- Usuário específico: Em ambientes restritos, use a diretiva su para executar como um usuário não-root

8. Casos reais e resolução de problemas comuns

Exemplo completo para uma aplicação Node.js

/var/log/nodeapp/*.log {
    daily
    rotate 7
    size 50M
    compress
    delaycompress
    missingok
    notifempty
    create 0640 nodeuser nodegroup
    su nodeuser nodegroup
    postrotate
        kill -USR2 $(cat /var/run/nodeapp.pid 2>/dev/null) 2>/dev/null || true
    endscript
}

Problemas frequentes e soluções

Logs não rotacionam: Verifique permissões do diretório e arquivos. Use logrotate -d para depurar.

Permissões negadas: Adicione su usuario grupo para executar a rotação como o usuário da aplicação.

Scripts falham: Teste o script manualmente. Use || true no final para evitar que falhas interrompam a rotação.

Aplicação não reabre logs: Certifique-se de que a aplicação trata o sinal adequadamente. Para aplicações que não suportam sinais, use copytruncate:

/var/log/legacyapp/*.log {
    daily
    rotate 7
    copytruncate
    compress
}

copytruncate copia o log e trunca o original, permitindo que a aplicação continue escrevendo sem precisar reabrir o arquivo. Use com cuidado, pois pode perder algumas linhas de log entre a cópia e o truncamento.

Referências