Exercice 05 : Centraliser les logs avec Loki et Promtail
🎯 Objectifs
À la fin de cet exercice, vous serez capable de :
- ✅ Déployer Loki, Promtail et Grafana avec Docker Compose
- ✅ Configurer
promtail-config.ymlpour scraper des logs locaux - ✅ Ajouter Loki comme datasource dans Grafana
- ✅ Explorer les logs avec des requêtes LogQL
- ✅ Corréler métriques Prometheus et logs Loki dans un même dashboard
Durée estimée : 30 minutes
Difficulté : ⭐⭐⭐☆☆ (Intermédiaire)
Prérequis : Exercice 03 complété, notions de Docker Compose
📖 Contexte
Loki est un système d'agrégation de logs conçu par Grafana Labs. Contrairement à Elasticsearch, il n'indexe pas le contenu des logs mais uniquement leurs labels - ce qui le rend très économique en ressources. Promtail est l'agent qui collecte les logs et les envoie à Loki.
📋 Énoncé
Déployez la stack PLG (Promtail + Loki + Grafana), collectez les logs système, et explorez-les avec LogQL.
🧭 Déroulement de l'exercice
Tâche 1 : Créer le docker-compose.yml
Créez un docker-compose.yml avec 3 services : Loki (port 3100), Promtail, et Grafana (port 3000).
Indice :
`yamlversion: "3.8"
services:
loki:
image: grafana/loki:latest
ports: ["3100:3100"]
command: -config.file=/etc/loki/local-config.yaml
>
promtail:
image: grafana/promtail:latest
volumes:
- /var/log:/var/log:ro
- ./promtail-config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
>
grafana:
image: grafana/grafana-oss:latest
ports: ["3000:3000"]
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
`
Vérification : docker compose up -d démarre les 3 services. curl http://localhost:3100/ready retourne ready.
Tâche 2 : Configurer Promtail
Créez promtail-config.yml pour collecter les logs du fichier /var/log/syslog (ou /var/log/messages selon la distribution) et les envoyer à Loki.
Indice :
`yamlserver:
http_listen_port: 9080
>
positions:
filename: /tmp/positions.yaml
>
clients:
- url: http://loki:3100/loki/api/v1/push
>
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
host: devopsfacile
__path__: /var/log/*.log
`
Vérification : docker compose logs promtail ne montre pas d'erreurs. curl http://localhost:9080/metrics | grep promtail_read_lines_total retourne un compteur.
Tâche 3 : Ajouter Loki comme datasource Grafana
Dans Grafana (http://localhost:3000) : Connections → Data sources → Add new data source → Loki. URL : http://loki:3100. Cliquez Save & Test.
Indice : Si Grafana et Loki sont dans le même réseau Docker Compose, utilisez le nom de service
lokicomme hostname. Le test affiche "Data source connected and labels found."
Vérification : La datasource Loki est configurée et le test réussit avec le message de succès.
Tâche 4 : Explorer les logs avec LogQL
Dans Grafana : Explore → sélectionner Loki. Exécutez ces requêtes LogQL :
{job="varlogs"}: tous les logs du job{job="varlogs"} |= "error": logs contenant "error"{job="varlogs"} | json | level = "warn": filtrage JSONrate({job="varlogs"}[5m]): taux de logs par seconde
Indice : Le sélecteur de stream
{}est obligatoire.|=filtre par contenu texte.| jsonparse les logs JSON.rate()sur un log stream donne le débit de logs.
Vérification : Des logs s'affichent pour chaque requête. Le timeline en haut montre la distribution temporelle.
Tâche 5 : Corréler métriques et logs
Créez un dashboard Grafana qui affiche côte à côte :
- Un panel Time series (datasource: Prometheus) :
rate(prometheus_http_requests_total[5m]) - Un panel Logs (datasource: Loki) :
{job="varlogs"}
Configurez les deux panels sur la même plage temporelle.
Indice : Dans un dashboard, ajoutez un panel de type Logs (pas Time series). Sélectionnez Loki comme datasource. Activez l'option Time range synchronisée dans les paramètres du dashboard pour lier les plages de temps des 2 panels.
Vérification : Les 2 panels se mettent à jour en même temps quand vous changez la plage de temps dans le dashboard.
🗂️ Mini-Projet
Ajoutez la collecte des logs des conteneurs Docker dans Promtail :
# Dans promtail-config.yml, ajoutez un second scrape_config
- job_name: docker
docker_sd_configs:
- host: unix:///var/run/docker.sock
refresh_interval: 5s
relabel_configs:
- source_labels: ['__meta_docker_container_name']
regex: '/(.*)'
target_label: containerMontez le socket Docker dans Promtail :
# Dans docker-compose.yml, pour le service promtail
volumes:
- /var/run/docker.sock:/var/run/docker.sockCheckpoints :
- Promtail collecte les logs des fichiers
/var/log/*.log - Loki reçoit les logs (visible dans Grafana Explore)
- Les requêtes LogQL avec filtre
|=fonctionnent - Le dashboard mixe métriques Prometheus et logs Loki