Files
2026-06-09 18:40:21 +02:00

183 lines
7.5 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
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é