183 lines
7.5 KiB
Markdown
183 lines
7.5 KiB
Markdown
---
|
||
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é
|