Por que saber ler logs é uma habilidade essencial?
Quando um serviço cai, quando uma aplicação retorna erro 500, quando o servidor fica lento sem motivo aparente — a resposta sempre está nos logs. Saber onde encontrá-los, como lê-los em tempo real e como filtrar informações relevantes é a diferença entre resolver um incidente em 5 minutos ou em 5 horas.
Os principais arquivos de log no Linux
/var/log/syslog # log geral do sistema (Debian/Ubuntu)
/var/log/messages # log geral (CentOS/RHEL)
/var/log/auth.log # autenticações e acessos SSH
/var/log/kern.log # logs do kernel
/var/log/nginx/ # access.log e error.log do Nginx
/var/log/apache2/ # logs do Apache
/var/log/mysql/ # logs do MySQL
/var/log/dpkg.log # instalações de pacotes (apt)
/var/log/cron.log # execuções do cron
Lendo logs em tempo real com tail
# Acompanhar log em tempo real
tail -f /var/log/nginx/error.log
# Últimas 100 linhas
tail -n 100 /var/log/syslog
# Múltiplos arquivos ao mesmo tempo
tail -f /var/log/nginx/error.log /var/log/nginx/access.log
Filtrando logs com grep
# Buscar erros
grep "error" /var/log/nginx/error.log
grep -i "error" /var/log/syslog # -i ignora maiúsculas/minúsculas
# Erros das últimas linhas
tail -n 500 /var/log/nginx/error.log | grep "500"
# Buscar IP específico no access log
grep "192.168.1.100" /var/log/nginx/access.log
# Linhas com contexto (3 linhas antes e depois)
grep -C 3 "FATAL" /var/log/app.log
# Excluir padrão
grep -v "200 OK" /var/log/nginx/access.log # apenas não-200s
Journalctl: logs centralizados do systemd
# Ver todos os logs do sistema
journalctl
# Logs de um serviço específico
journalctl -u nginx
journalctl -u mysql --since "1 hour ago"
# Acompanhar em tempo real
journalctl -f
journalctl -fu nginx # follow + serviço específico
# Filtrar por prioridade
journalctl -p err # apenas erros (emerg, alert, crit, err)
journalctl -p warning
# Por período
journalctl --since "2025-05-26 10:00:00" --until "2025-05-26 12:00:00"
journalctl --since today
journalctl --since yesterday
# Últimas N linhas
journalctl -n 100
# Formato JSON (para processamento)
journalctl -u nginx -o json-pretty | head -50
# Ver uso de disco pelos logs
journalctl --disk-usage
Analisando access logs do Nginx/Apache
# Top IPs por volume de requisições
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# Páginas mais acessadas
awk '{print $7}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head -20
# Requisições com erro 5xx
grep ' 5[0-9][0-9] ' /var/log/nginx/access.log | wc -l
# Tráfego por hora
awk '{print $4}' /var/log/nginx/access.log | cut -d: -f2 | sort | uniq -c
Rotação de logs com logrotate
# Ver configuração atual
cat /etc/logrotate.conf
ls /etc/logrotate.d/
# Exemplo de configuração para uma aplicação
sudo nano /etc/logrotate.d/minha-app
# /var/log/minha-app/*.log {
# daily
# rotate 14
# compress
# delaycompress
# missingok
# notifempty
# postrotate
# systemctl reload minha-app
# endscript
# }
# Testar configuração
sudo logrotate -d /etc/logrotate.d/minha-app # dry-run
sudo logrotate -f /etc/logrotate.d/minha-app # forçar rotação
Dica de debugging: Quando um serviço não inicia, sempre comece com journalctl -u nome-do-servico -n 50 — os últimos 50 logs geralmente contêm a causa raiz do problema.