Capítulo 11.2 - Gestión de Logs
Objetivos de Aprendizaje
Al final de este capítulo, usted será capaz de:
- Comprender el sistema de logs de Linux
- Utilizar journalctl (systemd)
- Analizar /var/log
- Configurar logrotate
- Buscar en los logs
- Centralizar los logs
Sistema de Logs
journalctl (systemd)
Logs de sistema modernos:
# Todos los logs
sudo journalctl
# Logs recientes
sudo journalctl -n 50
# Seguir en tiempo real
sudo journalctl -f
# Por unidad (servicio)
sudo journalctl -u sshd
sudo journalctl -u apache2
# Por prioridad
sudo journalctl -p err
sudo journalctl -p warning
# Por fecha
sudo journalctl --since "2024-01-01"
sudo journalctl --since "1 hour ago"
sudo journalctl --since yesterday
# Por usuario
sudo journalctl _UID=1000
/var/log
Logs tradicionales:
# Logs de sistema
/var/log/syslog # Ubuntu/Debian
/var/log/messages # Red Hat/CentOS
# Autenticación
/var/log/auth.log # Ubuntu/Debian
/var/log/secure # Red Hat/CentOS
# Aplicaciones
/var/log/apache2/ # Apache
/var/log/nginx/ # Nginx
/var/log/mysql/ # MySQL
# Cron
/var/log/cron # Red Hat/CentOS
# Ubuntu: en syslog
Análisis de Logs
Búsqueda Básica
# Grep simple
grep "ERROR" /var/log/syslog
# Ignorar mayúsculas/minúsculas
grep -i "error" /var/log/syslog
# Contexto
grep -C 5 "ERROR" /var/log/syslog # 5 líneas antes/después
# Varios archivos
grep "ERROR" /var/log/*.log
# Recursivo
grep -r "ERROR" /var/log/
Herramientas Avanzadas
# Contar ocurrencias
grep -c "ERROR" /var/log/syslog
# Líneas únicas
grep "ERROR" /var/log/syslog | sort -u
# Estadísticas
grep "ERROR" /var/log/syslog | awk '{print $1}' | sort | uniq -c
# Últimos errores
grep "ERROR" /var/log/syslog | tail -20
Búsqueda con journalctl
# Búsqueda de texto
sudo journalctl -g "ERROR"
# Por binario
sudo journalctl /usr/bin/sshd
# Combinación
sudo journalctl -u sshd -p err --since "1 hour ago"
Rotación de Logs
logrotate
Configuración automática:
# Configuración
/etc/logrotate.conf
/etc/logrotate.d/
# Probar configuración
sudo logrotate -d /etc/logrotate.conf
# Forzar rotación
sudo logrotate -f /etc/logrotate.conf
Ejemplo de Configuración
# /etc/logrotate.d/mon-app
/var/log/mon-app/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
sharedscripts
postrotate
systemctl reload mon-app > /dev/null 2>&1 || true
endscript
}
Opciones:
- daily/weekly/monthly: Frecuencia
- rotate N: Mantener N rotaciones
- compress: Comprimir logs antiguos
- missingok: No error si el archivo no existe
- notifempty: No rotar si está vacío
- create: Crear nuevo archivo con permisos
Logs de Cron
Ver los Logs de Cron
# Ubuntu/Debian (en syslog)
sudo grep CRON /var/log/syslog
# Red Hat/CentOS
sudo tail -f /var/log/cron
# journalctl
sudo journalctl -u cron
sudo journalctl _COMM=cron
Logs de Tareas
# Si hay redirección en crontab
# 0 2 * * * /script.sh > /var/log/script.log 2>&1
# Ver logs
tail -f /var/log/script.log
# Buscar errores
grep -i error /var/log/script.log
Monitoreo de Cron
#!/bin/bash
# Verificar ejecución de cron
# Verificar última ejecución
LAST_RUN=$(grep "script.sh" /var/log/syslog | tail -1 | awk '{print $1, $2, $3}')
if [ -z "$LAST_RUN" ]; then
echo "ALERTA: El script cron nunca se ha ejecutado"
else
echo "Última ejecución: $LAST_RUN"
fi
# Verificar errores
ERRORS=$(grep "script.sh" /var/log/syslog | grep -i error | wc -l)
if [ "$ERRORS" -gt 0 ]; then
echo "ALERTA: $ERRORS errores detectados"
fi
Centralización de Logs
rsyslog
Configuración del servidor:
# /etc/rsyslog.conf
# Activar UDP/TCP
module(load="imudp")
input(type="imudp" port="514")
module(load="imtcp")
input(type="imtcp" port="514")
# Almacenar por host
$template RemoteHost,"/var/log/remote/%HOSTNAME%/%PROGRAMNAME%.log"
*.* ?RemoteHost
Configuración del cliente:
# /etc/rsyslog.conf
# Enviar al servidor
*.* @192.168.1.100:514
Logstash/Filebeat
Stack ELK:
- Elasticsearch: Almacenamiento
- Logstash: Procesamiento
- Kibana: Visualización
- Filebeat: Recolección
Scripts Útiles
Análisis Diario
#!/bin/bash
# Análisis diario de logs
DATE=$(date +%Y%m%d)
REPORT="/var/log/analysis-$DATE.txt"
{
echo "=== Análisis de Logs $(date) ==="
echo
echo "=== Errores ==="
grep -i error /var/log/syslog | tail -20
echo
echo "=== Advertencias ==="
grep -i warning /var/log/syslog | tail -20
echo
echo "=== Intentos fallidos de SSH ==="
grep "Failed password" /var/log/auth.log | wc -l
echo
echo "=== Procesos principales ==="
ps aux --sort=-%cpu | head -10
} > "$REPORT"
Limpieza de Logs
#!/bin/bash
# Limpiar logs antiguos
# Eliminar logs > 30 días
find /var/log -name "*.log" -mtime +30 -delete
find /var/log -name "*.gz" -mtime +90 -delete
# Limpiar journal de systemd
sudo journalctl --vacuum-time=30d
sudo journalctl --vacuum-size=500M
Resumen
En este capítulo, usted ha aprendido:
journalctl: Logs de systemd, búsqueda, filtros
/var/log: Logs tradicionales, aplicaciones
Búsqueda: grep, journalctl -g, herramientas avanzadas
logrotate: Rotación automática, configuración
Logs de cron: Monitoreo de ejecuciones, detección de errores
Centralización: rsyslog, ELK stack
Práctica: Análisis, limpieza, monitoreo
Próximos Pasos
Capítulo 11.3: Monitoreo de Crons y Alertas
Módulo 12: Administración Avanzada
Capítulo creado el: Diciembre 2024