Logspout est un outil conçu pour router les journaux des conteneurs Docker, offrant la possbiilité de diffuser les logs vers plusieurs systèmes en parallèle. En intégrant des mécanismes de configuration flexibles, il simplifie la gestion des flux de journaux dans des environnements distribués.
Raisons d'utiliser un routage multi-destination
Dans une architecture microservices, il est courant de devoir :
- Envoyer les journaux critiques vers Elasticsearch pour l'analyse
- Transmettre les erreurs en temps réel à Slack pour les alertes
- Sauvegarder tous les logs sur un serveur Syslog
- Écrire les journaux de dévelopement dans un système de fichiers local
Configuration initiale : URIs séparées par des virgules
La méthode la plus directe consiste à lister plusieurs URIs dans la commande :
docker run -v /var/run/docker.sock:/var/run/docker.sock \
monregistre/logspout \
raw://10.0.0.15:4500?filter.name=*_db,syslog+tls://serveur-logs.example.com:5555?filter.name=*_app
Cette configuration dirige les journaux des conteneurs dont le nom se termine par _db vers un hôte raw, et ceux terminant par _app vers un serveur Syslog sécurisé.
Filtrage avancé pour un contrôle précis
Par nom de conteneur :
docker run -v /var/run/docker.sock:/var/run/docker.sock \
monregistre/logspout \
raw://192.168.1.50:6000?filter.name=*_backend
Par source de journal :
docker run -v /var/run/docker.sock:/var/run/docker.sock \
monregistre/logspout \
raw://192.168.1.50:6000?filter.sources=stdout%2Cstderr
Par étiquettes :
docker run -v /var/run/docker.sock:/var/run/docker.sock \
monregistre/logspout \
raw://192.168.1.50:6000?filter.labels=env:prod%2Crole:api
Gestion dynamique via l'API REST
Logspout expose une API HTTP pour modifier les routes à chaud :
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"adapter": "syslog",
"address": "logs.fournisseur.com:5555",
"filter_name": "*_api",
"filter_sources": ["stdout"],
"options": {
"append_tag": ".api-gateway"
}
}' \
http://localhost:8080/routes
Pour lister les routes existantes :
curl http://localhost:8080/routes
Scénarios de configuration pratiques
Environnement de développement :
docker run -v /var/run/docker.sock:/var/run/docker.sock \
monregistre/logspout \
raw://localhost:4000?filter.name=*_dev,syslog://syslog-interne:514?filter.name=*_microservice
Haute disponbiilité en production :
docker run -v /var/run/docker.sock:/var/run/docker.sock \
monregistre/logspout \
syslog+tls://principal.logs.com:6514,syslog+tls://secondaire.logs.com:6514
Bonnes pratiques et astuces
Priorité des routes : Lorsque plusieurs routes correspondent à un conteneur, elles sont traitées dans l'ordre de configuration. Placez les routes les plus spécifiques en premier.
Optimisation des performances : Utilisez BACKLOG=false pour ignorer les journaux historiques et ajustez INACTIVITY_TIMEOUT pour détecter les flux inactifs.
Exclusion de conteneurs : Désactivez le routage pour un conteneur avec :
docker run -d -e 'LOGSPOUT=ignore' mon-app
Traitement des logs multi-lignes : Pour les piles d'erreurs comme Java :
docker run -v /var/run/docker.sock:/var/run/docker.sock \
monregistre/logspout \
multiline+raw://agregateur-logs:5000
Avantages clés
La fonctionnalité multi-destination de Logspout offre :
- Flexibilité via une variété d'adaptateurs et protocoles
- Extensibilité grâce à une architecture modulaire
- Simplicité de configuration par des URIs
- Réalité du routage sans délai
- Fiabilité avec reconnexion automatique et récupération des pannes