Skip to content

Gestion des logs

Persistance

Dans le cycle de vie d'une application, il est toujours nécessaire d'accéder aux logs, afin par exemple, de débugguer l'application. Pour se faire, dans le cadre d'un environnement de production il ne faut pas sauvegarder les logs dans un container.

Les logs sont stockés dans la layer du container liée à son cycle de vie ; celui créé au démarrage du container et qui est accessible en lecture et écriture. Si le container est supprimé, ils seront donc perdus. Il est recommendé de logger sur la sortie standard (stdout) et l'erreur standard (stderr) afin de pouvoir les utiliser via un agrégateur de logs et un stockage centralisé.

Drivers

Par défault sont installés plusieurs plugins sur la machine hôte

shell
docker info | grep "Plugin" -A 3

 Plugins:
  buildx: Build with BuildKit (Docker Inc., v0.6.1-docker)
  compose: Docker Compose (Docker Inc., 2.1.1)

--
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog

Chaque plugin peut être utilisé via le driver qu'il définit.

Par défaut c'est le drive json-file qui sert à la gestion des logs. Celui-ci stockant dans un fichier json (/var/lib/docker/containers/CONTAINER_ID/CONTAINER_ID-json.log), on comprend pourquoi il est difficilement exploitable dans un environnement de production ; le fichier étant rattaché à la layer de démarrage du container.

Principaux drivers de logs

DriverDestination
json-filefichier local (driver par défaut)
awslogsservice AWS CloudWatch
gcplogsservice de logging de Google Cloud Platform (GCP)
logentriesservice https://logentries.com
spunkservice https://spunk.com
gelfgendpoint GELF (Graylog Extended Log Format), ex: Logstash
syslogdaemon syslog tournant sur la machine hôte
fluentddaemon fluentd tournant sur la machine hôte
journalddaemon journald tournant sur la machine hôte

Pour utiliser un driver spécifique il existe 2 solutions :

Pour configurer un driver, on peut le faire via :

  • le daemon docker
shell
nvim /etc/docker/daemon.json

{
  "log-driver": "gelf",
  "log-opts": {
    "gelf-address": "udp://192.168.99.100:5000"
  }
}
  • le service docker via systemd
shell
nvim /etc/systemd/system/docker.service.d/10-machine.conf

ExecStart=/usr/bin/dockerd -H fd:// --log-driver=gelf --log-opt gelf-address=udp://192./168.99.100:5000

Si toutefois il est impossible d'accéder à la configuration du daemon on peut aussi spécifier le driver à utiliser au moment du lancement du container :

  • docker-cli
shell
docker service create --log-driver=gelf --log-opt gelf-address=udp://10.0.0.18:5000 reverse-proxy:1.0
  • docker-compose
services:
  reverse-proxy:
    image: reverse-proxy:1.0
    logging:
      driver: "gelf"
      options:
        gelf-address: "udp://10.0.0.18:5000"