Centraliser les logs d’une infrastructure de taille moyenne avec Elasticsearch revient vite à plusieurs centaines d’euros par mois. Loki propose une alternative radicalement différente, avec un modèle d’indexation qui le rend dix fois moins coûteux à opérer.
Le principe qui change tout : indexer les labels, pas le contenu
Elasticsearch indexe chaque mot de chaque ligne de log. C’est puissant pour la recherche full-text, mais l’index grossit aussi vite que les logs eux-mêmes.
Loki fait le choix inverse : il n’indexe que les labels (métadonnées), pas le contenu des logs. Le texte des logs est stocké compressé et n’est scanné qu’au moment d’une requête.
Labels indexés : {app="api", env="prod", pod="api-7d4f9b-xk2"}
Contenu non indexé : "2026-05-05T14:32:01Z ERROR timeout connecting to db"
Résultat : des coûts de stockage et d’indexation bien inférieurs, au prix d’une recherche plus lente sur le contenu.
Collecter les logs avec Promtail
Promtail est l’agent de collecte officiel pour Loki. Sur Kubernetes, un DaemonSet Promtail sur chaque node récupère automatiquement les logs de tous les pods :
scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
pipeline_stages:
- cri: {} # parse le format CRI-O/containerd
- labeldrop:
- filename # éviter la cardinalité excessive
LogQL : requêter les logs comme des métriques
LogQL est le langage de requête de Loki. Il emprunte la syntaxe de PromQL.
# Filtrer les logs d'erreur de l'API
{app="api", env="prod"} |= "ERROR"
# Compter les erreurs par minute (log query → metric)
rate({app="api"} |= "ERROR" [1m])
# Parser les logs JSON et filtrer sur un champ
{app="api"} | json | status_code >= 500
La bascule entre vue log (lignes brutes) et vue métrique (graphe de taux) se fait sans changer de tool — c’est Grafana qui orchestre les deux.
Corrélation logs/métriques/traces dans Grafana
La vraie valeur de Loki apparaît quand il est intégré dans une stack Grafana complète avec Prometheus et Tempo :
- Un graphe Prometheus montre un pic de latence à 14h32
- Vous cliquez sur Explore logs depuis le panel — Grafana ouvre Loki pré-filtré sur la même fenêtre temporelle et le même service
- Vous trouvez les lignes d’erreur, cliquez sur un trace ID — Grafana ouvre Tempo avec la trace complète
Ce flux sans aller-retour entre des outils différents réduit considérablement le temps de résolution d’incidents.
Cardinalité : le piège à éviter
Le seul risque avec Loki : les labels à haute cardinalité. N’utilisez jamais comme label une valeur qui peut prendre des millions de valeurs différentes (user_id, request_id, IP…).
# ❌ À éviter — cardinalité explosive
labels:
user_id: "{{ .UserID }}"
# ✅ Correct — cardinalité faible et stable
labels:
app: "api"
env: "prod"
region: "eu-west"
Notre formation Grafana & Prometheus couvre la stack complète Prometheus + Loki + Tempo avec des ateliers pratiques sur Kubernetes.