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.