Image de la bannière : Logs Docker avec Systemd

Logs Docker avec Systemd

post thumb
Container
by Jérémie Lesage/ on 06 Oct 2020

Logs Docker avec Systemd

Suite à notre article sur l’utilisation des conteneurs avec Systemd. Je voudrais préciser un point sur la gestion des logs dans les conteneurs.

La Règle Docker

La bonne pratique officielle est de ne pas générer les logs dans un fichier dans le conteneur (/var/log/conteneur.log). La règle est donc d’envoyer tous les logs dans la sortie standard et de laisser Docker s’occuper des logs.

C’est très pratique car on peut ensuite consulter les logs avec les outils docker :

docker logs
docker-compose logs

Cependant, attention à bien configurer votre deamon docker car par défaut il n’effectue pas de rotation de logs ce qui peut provoquer la saturation de l’espace disque.

# /etc/docker/daemon.json
{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file":"10",
    "compress": "true"
  }
}

Avec SystemD (et JournalD)

Dans le cas d’un démarrage des conteneurs avec systemd, il peut être préférable d’envoyer les logs vers journald en activant le bon log-driver.

# /etc/docker/daemon.json
{
"log-driver": "journald"
}

Vous pouvez ensuite consulter les logs docker dans journald directement. (Attention, le changement du log-driver ne s’applique pas aux conteneurs déjà créés)

systemctl restart docker
docker run -d --rm --name hello_world \
  alpine sh -c 'while true; do sleep 1.5; echo "hello world"; done'

journalctl CONTAINER_NAME=hello_world

  dockerd[944]: hello world
  dockerd[944]: hello world
  dockerd[944]: hello world

docker stop hello_world

Pour se simplifier la vie, vous pouvez également utiliser les tags pour filtrer vos logs. Ce qui nécessite de définir le paramètre --log-opt.

Par exemple

for i in $(seq 0 2); do
docker run -d --rm \
  --log-opt labels=app --label app=hello \
    alpine sh -c "while true; do sleep 1.5; echo \"hello world $i\"; done"
done

journalctl app=hello

  dockerd[17136]: hello world 0
  dockerd[17136]: hello world 1
  dockerd[17136]: hello world 2
  dockerd[17136]: hello world 0
  dockerd[17136]: hello world 1
  dockerd[17136]: hello world 2

docker container ls -f "label=app=hello" -q | xargs docker stop

Maintenant vous avez une solution simple mais efficace pour gérer vos logs docker. Pour vous aider dans la conteneurisation de vos applications historique, contactez nous.