--- title: Loki created: 2026-06-07 updated: 2026-06-07 type: app tags: [catalogue, logs, observability, loki, grafana, promtail, multi-tenant, s3, kubernetes, docker] confidence: high contested: false sources: [https://selfh.st/apps/?tag=Logs, https://github.com/grafana/loki] --- # 📋 Loki > **L'agrégateur de logs cloud-native par Grafana** : indexation par labels, stockage objet, intégration native avec Prometheus et Grafana. Le compagnon idéal de la stack Grafana. ## 📋 Informations Générales | Champ | Valeur | | :--- | :--- | | **Site web** | [grafana.com/oss/loki](https://grafana.com/oss/loki/) | | **GitHub** | [grafana/loki](https://github.com/grafana/loki) | | **License** | AGPL-3.0 | | **Langage** | Go | | **Étoiles GitHub** | 28.3k ⭐ | | **Dernière MAJ** | 2026-06-05 | | **Catégorie** | [[cat-logs|Logs]] | ## 📝 Description **Loki** est un système d'**agrégation de logs multi-tenant** conçu par Grafana Labs, inspiré de Prometheus. Contrairement à un ELK classique, Loki **n'indexe pas le contenu des logs** : il n'indexe qu'un ensemble de **labels** (comme `job`, `instance`, `namespace`) et stocke les logs bruts compressés dans du stockage objet (S3, GCS, MinIO, filesystem). Cette approche réduit drastiquement les coûts de stockage et accélère l'ingestion. Loki s'intègre nativement avec **Grafana** pour la visualisation et **Promtail** (ou Grafana Alloy) pour la collecte de logs. Les requêtes se font en **LogQL**, un langage proche de PromQL, qui permet de filtrer par labels puis d'appliquer des regex sur le contenu. Le couple **Loki + Grafana + Prometheus** forme la stack d'observabilité open source de référence (souvent appelée "LGTM Stack"). **Public cible** : équipes techniques qui veulent une stack logs/métriques/traces unifiée, labos personnels avec budget serré (Loki coûte 10× moins cher qu'Elasticsearch à scale équivalente), et environnements Kubernetes massifs. - ✅ **Multi-tenant** natif (isolation par tenant ID) - ✅ **Stockage objet** (S3, GCS, Azure Blob, MinIO, filesystem) - ✅ **LogQL** : requêtes puissantes (regex, parsing, métriques dérivées) - ✅ **Indexation par labels** : pas d'index inversé, coûts réduits - ✅ **Scalabilité horizontale** (mode microservices : read/write/ingester/querier) - ✅ **Intégration Grafana** native (exploration, alertes, dashboards) - ✅ **Promtail / Alloy** : agents de collecte officiels - ✅ **Mode single-binary** pour les petits déploiements - ✅ **Compression** élevée (gzip, snappy) - ✅ **Compatible Kubernetes** (Helm chart officiel) - ✅ **API HTTP** d'ingestion (compatible avec n'importe quel agent) ## 🚀 Installation ### Option 1 : Docker Compose (single-binary mode) ```yaml # docker-compose.yml version: '3.8' services: loki: image: grafana/loki:3.3.0 container_name: loki restart: unless-stopped command: -config.file=/etc/loki/local-config.yaml ports: - "3100:3100" volumes: - loki-data:/loki - ./loki-config.yaml:/etc/loki/local-config.yaml:ro labels: - "traefik.enable=true" - "traefik.http.routers.loki.rule=Host(`loki.example.com`)" - "traefik.http.routers.loki.entrypoints=websecure" - "traefik.http.routers.loki.tls.certresolver=letsencrypt" promtail: image: grafana/promtail:3.3.0 container_name: promtail restart: unless-stopped command: -config.file=/etc/promtail/config.yml volumes: - /var/log:/var/log:ro - /var/lib/docker/containers:/var/lib/docker/containers:ro - /var/run/docker.sock:/var/run/docker.sock:ro - ./promtail-config.yml:/etc/promtail/config.yml:ro minio: image: minio/minio:latest container_name: loki-minio restart: unless-stopped command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: loki MINIO_ROOT_PASSWORD: CHANGEME-STRONG-PASSWORD volumes: - minio-data:/data ports: - "9000:9000" - "9001:9001" volumes: loki-data: minio-data: ``` ### Option 2 : Helm (Kubernetes) ```bash helm repo add grafana https://grafana.github.io/helm-charts helm install loki grafana/loki-stack \ --namespace logging --create-namespace \ --set promtail.enabled=true \ --set grafana.enabled=false \ --set loki.persistence.enabled=true \ --set loki.persistence.size=50Gi ``` ## ⚙️ Configuration Initiale 1. **Démarrer la stack** : `docker compose up -d` 2. **Accéder à Loki** : `http://IP:3100` (API) 3. **Connecter Grafana** : Administration > Data Sources > Loki > URL `http://loki:3100` 4. **Tester une requête** : `{job="docker"} |= "error"` 5. **Créer des labels cohérents** : configurer Promtail pour étiqueter par service/env 6. **Activer la rétention** : configurer `compactor` et `limits_config.retention_period` 7. **Mettre en place le stockage objet** (S3/MinIO) pour la production ## 🔄 Alternatives ### Open Source - [[app-quickwit]] — Recherche full-text, écrit en Rust - [[app-graylog]] — Plateforme SIEM-like (⚠️ licence SSPL) - [[app-parseable]] — Format columnar Parquet sur S3 - [[app-elasticsearch]] — La référence historique (mais lourd) - **OpenSearch** — Fork AWS d'Elasticsearch - **Vector** ( Timber ) — Collecteur/transformateur de logs (souvent utilisé avec Loki) ### Comparaison Loki vs autres | Critère | Loki | Elasticsearch | Quickwit | Graylog | | :--- | :--- | :--- | :--- | :--- | | **Stockage** | Objet (S3) | Disque/JVM | Objet (S3) | MongoDB + ES | | **Indexation** | Labels | Full-text | Inverted index | Full-text | | **Coût** | Très bas | Élevé | Bas | Moyen | | **Recherche full-text** | Regex (LogQL) | Excellente | Excellente | Bonne | | **Métriques dérivées** | ✅ (LogQL) | ❌ | ❌ | ✅ | | **Multi-tenant** | ✅ Natif | Plugins | ❌ | ✅ | | **Setup** | Facile | Complexe | Moyen | Moyen | | **Stack Grafana** | ✅ Natif | Plugin | Plugin | Plugin | **Verdict** : Loki est **le choix par défaut** si vous utilisez déjà Grafana/Prometheus. Pour une recherche full-text pure, tournez-vous vers [[app-quickwit]]. Pour un SIEM, Graylog reste plus complet. ### Propriétaires (ce que Loki remplace) - **Datadog Logs** (cher, vendor lock-in) - **Splunk** (très cher, enterprise) - **Sumo Logic** - **Loggly** - **New Relic Logs** ## 🔐 Sécurité - ⚠️ **Logs = données sensibles** : peuvent contenir mots de passe, tokens, PII - ✅ **Chiffrement at-rest** : LUKS/ZFS sur disque + chiffrement S3 côté bucket - ✅ **Chiffrement in-transit** : TLS obligatoire (Traefik + Loki en HTTPS) - ✅ **Authentification** : basic auth, JWT, ou proxy SSO devant Loki - ✅ **RBAC multi-tenant** : isolation par `X-Scope-OrgID` header - ⚠️ **Rétention** : GDPR/RGPD — limiter à 30/90 jours pour les logs user (`compactor.retention_enabled`) - ✅ **PII filtering** : regex dans Promtail/Alloy pour anonymiser emails, IPs, tokens - ✅ **Audit log** : activer `loki.audit_log_enabled` pour tracer les accès - ✅ **Backups chiffrés** : [[app-restic]] sur le bucket S3 des chunks ## 📚 Ressources - [GitHub grafana/loki](https://github.com/grafana/loki) - [Documentation officielle](https://grafana.com/docs/loki/latest/) - [LogQL cheat sheet](https://grafana.com/docs/loki/latest/logql/) - [Helm chart loki-stack](https://github.com/grafana/helm-charts/tree/main/charts/loki-stack) ## Pages Liées - [[cat-logs]] — Catégorie Logs - [[app-prometheus]] — Métriques (souvent couplé à Loki) - [[app-grafana]] — Visualisation - [[app-tempo]] — Traces - [[app-uptime-kuma]] — Monitoring uptime - [[securisation-home-lab]] — Bonnes pratiques sécurité