Saltar al contenido principal

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