Más allá de los logs locales: centralización avanzada

Cuando administras más de un servidor, revisar logs con journalctl y rsyslog en cada máquina individualmente se vuelve insostenible. Necesitas una plataforma centralizada que indexe, busque y visualice logs de todos tus sistemas. Aquí es donde entran ELK Stack (Elasticsearch, Logstash, Kibana) y Loki + Grafana. Ambas son soluciones modernas, pero con filosofías muy distintas.

ELK Stack es el estándar de la industria desde hace años: Elasticsearch indexa todo, Logstash transforma y enruta, y Kibana presenta dashboards interactivos. Loki, por su parte, es la apuesta de Grafana Labs: más ligero, más barato de operar y diseñado para integrarse nativamente con Grafana.

ELK Stack con Docker Compose

Levantar ELK localmente para pruebas es muy sencillo con Docker. A continuación un docker-compose.yml completo:

version: '3.8'
services:
  elasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:8.12.0
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    ports:
      - "9200:9200"
    volumes:
      - es_data:/usr/share/elasticsearch/data

  logstash:
    image: docker.elastic.co/logstash/logstash:8.12.0
    ports:
      - "5000:5000"
      - "5044:5044"
    volumes:
      - ./logstash.conf:/usr/share/logstash/pipeline/logstash.conf
    depends_on:
      - elasticsearch

  kibana:
    image: docker.elastic.co/kibana/kibana:8.12.0
    ports:
      - "5601:5601"
    environment:
      - ELASTICSEARCH_HOSTS=http://elasticsearch:9200
    depends_on:
      - elasticsearch

volumes:
  es_data:

El pipeline de Logstash necesita un archivo logstash.conf que defina cómo procesar los datos entrantes:

# logstash.conf
input {
  beats {
    port => 5044
  }
  syslog {
    port => 5000
  }
}

filter {
  grok {
    match => { "message" => "%{SYSLOGLINE}" }
  }
  date {
    match => [ "timestamp", "MMM  d HH:mm:ss", "MMM dd HH:mm:ss" ]
  }
}

output {
  elasticsearch {
    hosts => ["http://elasticsearch:9200"]
    index => "logs-%{+YYYY.MM.dd}"
  }
}

Para enviar logs desde los servidores remotos, instalas Filebeat en cada máquina:

# Instalar Filebeat
apt install filebeat -y

# /etc/filebeat/filebeat.yml
filebeat.inputs:
- type: log
  paths:
    - /var/log/*.log
    - /var/log/syslog

output.logstash:
  hosts: ["servidor-elk:5044"]

# Iniciar servicio
systemctl enable filebeat && systemctl start filebeat

Loki + Grafana + Promtail

Loki es una alternativa mucho más ligera. No indexa el contenido completo de los logs, solo los metadatos (labels), lo que reduce drásticamente el uso de almacenamiento y recursos.

version: '3.8'
services:
  loki:
    image: grafana/loki:2.9.0
    ports:
      - "3100:3100"
    command: -config.file=/etc/loki/local-config.yaml
    volumes:
      - ./loki-config.yaml:/etc/loki/local-config.yaml

  promtail:
    image: grafana/promtail:2.9.0
    volumes:
      - /var/log:/var/log
      - ./promtail-config.yaml:/etc/promtail/config.yml
    command: -config.file=/etc/promtail/config.yml

  grafana:
    image: grafana/grafana:latest
    ports:
      - "3000:3000"
    environment:
      - GF_AUTH_ANONYMOUS_ENABLED=true
    volumes:
      - grafana_data:/var/lib/grafana

volumes:
  grafana_data:

Las consultas en Loki se hacen con LogQL, un lenguaje parecido a PromQL pero orientado a logs. Aquí algunos ejemplos básicos:

# Contar errores por host en los últimos 15 minutos
rate({job="varlogs"} |= "error" [15m])

# Sumar errores por nivel
sum by (level) (rate({job="varlogs"} |= "error" [5m]))

# Buscar en un servicio específico
{job="varlogs",service="sshd"} |= "Failed password"

# Estadísticas por label
topk(5, sum by (hostname) (count_over_time({job="varlogs"}[1h])))

ELK vs Loki: comparativa

¿Cuál elegir? Depende del contexto. ELK Stack es más completo pero pesado: Elasticsearch fácilmente consume 4-8 GB de RAM. Loki es mucho más eficiente (puede correr con 1 GB o menos). ELK indexa todo el contenido, lo que permite búsquedas de texto completo ultrarrápidas pero a costa de almacenamiento masivo. Loki indexa solo labels y logra compresiones de 10:1 frente a ELK. La complejidad de operación también difiere: ELK requiere gestionar Elasticsearch cluster, Logstash pipelines, y balanceo de índices. Loki se administra casi como Prometheus: simple y confiable. En producción, muchos equipos ejecutan ambos: ELK para búsqueda profunda forense y Loki para dashboards operativos del día a día.