---
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é
