logrotate: gerenciar logs na VPS
Logs sem rotação enchem o disco silenciosamente até o servidor parar de funcionar. logrotate é a solução nativa do Linux — rotaciona, comprime e expira logs automaticamente para todos os serviços. Configurado corretamente, você nunca mais vai acordar com um servidor parado por falta de espaço em /var/log.
Entender o logrotate e sua configuração
Como o logrotate funciona e onde ficam as configurações:
bash
# Verificar instalação (já vem no Ubuntu):
which logrotate
logrotate --version
# Arquivos de configuração:
# /etc/logrotate.conf — configuração global
# /etc/logrotate.d/ — configurações por serviço (um arquivo cada)
# /var/lib/logrotate/status — registro do último rotate por arquivo
# Executado diariamente pelo cron:
cat /etc/cron.daily/logrotate
# Testar sem executar de verdade:
sudo logrotate --debug /etc/logrotate.conf
# Forçar rotação agora (ignorar data do último rotate):
sudo logrotate --force /etc/logrotate.d/nginx
# Ver status da última execução:
sudo cat /var/lib/logrotate/status | grep nginxConfigurar rotação para Nginx e aplicações
Templates de configuração para os serviços mais comuns:
bash
# /etc/logrotate.d/nginx — sobrescrever o padrão:
/var/log/nginx/*.log {
daily # rotacionar diariamente
missingok # não errar se arquivo não existir
rotate 14 # manter 14 arquivos rotacionados
compress # comprimir com gzip
delaycompress # comprimir na próxima rotação (não na atual)
notifempty # não rotacionar se arquivo vazio
create 0640 www-data adm # criar novo arquivo com essas permissões
sharedscripts
postrotate
# Reabrir os arquivos de log sem reiniciar o Nginx:
if [ -f /var/run/nginx.pid ]; then
kill -USR1 $(cat /var/run/nginx.pid)
fi
endscript
}
# /etc/logrotate.d/minha-api — logs da aplicação Node.js:
/var/log/minha-api/*.log {
daily
missingok
rotate 30 # manter 30 dias
compress
delaycompress
notifempty
su ubuntu ubuntu # executar como usuário ubuntu
postrotate
# Recarregar PM2 para reabrir o arquivo de log:
pm2 reloadLogs 2>/dev/null || true
endscript
}Controlar logs do Docker
Configurar limite de tamanho nos logs de containers:
json
# Configuração global para todos os containers:
# /etc/docker/daemon.json:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m", # máximo de 10 MB por arquivo
"max-file": "3" # manter 3 arquivos (30 MB total por container)
}
}
# Aplicar: sudo systemctl reload docker
# Configurar por container no docker-compose.yml:
services:
api:
image: minha-api:latest
logging:
driver: json-file
options:
max-size: "50m"
max-file: "5" # 250 MB total para este container
# Ver uso de disco de logs do Docker:
sudo du -sh /var/lib/docker/containers/*/
sudo du -sh /var/lib/docker/containers/ --total
# Limpar logs antigos de containers manualmente:
sudo truncate -s 0 /var/lib/docker/containers/**/*-json.log
# Para containers antigos que não têm limite configurado:
# Parar, recriar com novas configurações de logMonitorar uso de disco por logs
Alertar antes que os logs encham o disco:
bash
#!/bin/bash
# /opt/scripts/monitor-disco.sh
TELEGRAM_TOKEN="SEU_TOKEN"
TELEGRAM_CHAT_ID="SEU_CHAT_ID"
LIMITE_PERCENT=80
# Verificar uso de cada partição:
df -h | grep -vE "^Filesystem|tmpfs|udev" | while read line; do
USO=$(echo "$line" | awk '{print $5}' | tr -d '%')
PONTO=$(echo "$line" | awk '{print $6}')
if [ "$USO" -gt "$LIMITE_PERCENT" ]; then
MSG="⚠️ Disco $PONTO em $USO% no $(hostname)"
curl -s -X POST "https://api.telegram.org/bot$TELEGRAM_TOKEN/sendMessage" \
-d "chat_id=$TELEGRAM_CHAT_ID" -d "text=$MSG"
fi
done
# Checar diretórios que mais crescem:
du -sh /var/log/* 2>/dev/null | sort -rh | head -10
du -sh /var/lib/docker/containers/* 2>/dev/null | sort -rh | head -5
# Cron — verificar de hora em hora:
# 0 * * * * root /opt/scripts/monitor-disco.shRotação de logs do PM2 e Node.js
Gerenciar logs de aplicações Node.js gerenciadas pelo PM2:
bash
# PM2 tem plugin de logrotate nativo:
pm2 install pm2-logrotate
# Configurar:
pm2 set pm2-logrotate:max_size 50M # rotacionar ao atingir 50 MB
pm2 set pm2-logrotate:retain 30 # manter 30 arquivos
pm2 set pm2-logrotate:compress true # comprimir com gzip
pm2 set pm2-logrotate:dateFormat YYYY-MM-DD # data no nome do arquivo
pm2 set pm2-logrotate:rotateInterval '0 0 * * *' # diariamente à meia-noite
# Ver configuração atual:
pm2 get pm2-logrotate
# Logs do PM2 ficam em:
# ~/.pm2/logs/nome-da-app-out.log (stdout)
# ~/.pm2/logs/nome-da-app-error.log (stderr)
# Forçar rotação manual do PM2:
pm2 reloadLogs
# Linkar logs do PM2 ao logrotate do sistema:
# /etc/logrotate.d/pm2:
/root/.pm2/logs/*.log {
daily
rotate 7
compress
missingok
notifempty
postrotate
pm2 reloadLogs 2>/dev/null || true
endscript
}$ runstack deploy --plan starter
Não quer configurar manualmente?
Não quer configurar manualmente? Implante o VPS em menos de 3 minutos com a Runstack. Infraestrutura da OPEN DATACENTER, com servidores no Brasil.