Docker, une plateforme de virtualisation populaire au niveau de l’OS qui nous permet de fournir des applications dans des paquets connus sous le nom de conteneurs qui, en termes simples, sont des environnements isolés avec leurs propres logiciels, bibliothèques et fichiers de configuration.

Comme tout autre logiciel moderne, la journalisation des événements et des messages tels que les avertissements et les erreurs fait partie intégrante de la plateforme Docker, ce qui vous permet de déboguer vos applications et vos problèmes de production.

Nous allons aborder quelques méthodes simples pour gérer et surveiller les journaux de vos conteneurs. Commençons.

Commande Docker Logs

La syntaxe de base pour récupérer les logs d’un conteneur est la suivante :

$ docker logs [OPTIONS] <CONTAINER-NAME OR ID>

OR

$ docker container logs [OPTIONS] <NOM DU CONTENEUR OU ID>

Les deux syntaxes sont essentiellement les mêmes, c’est pourquoi nous nous concentrerons sur le reste des commandes de cet article en tant que docker logs.

Notez cependant que la commande ci-dessus ne fonctionne que pour les conteneurs démarrés avec le pilote de journalisation json-file ou journald.

Ici, OPTIONS fait référence aux drapeaux disponibles et supportés par la commande docker logs, qui sont listés ci-dessous :

Nom, raccourci Défaut Description
--details Affiche les détails supplémentaires fournis dans les journaux.
-follow, -f Suivre la sortie du journal
--since Affiche les journaux depuis l’horodatage (par exemple 2021-08-28T15:23:37Z) ou de manière relative (par exemple 56m pour 56 minutes)
--tail , -n all Nombre de lignes à afficher à partir de la fin des journaux
--timestamps, -t Afficher les horodatages
--until API 1.35
Affiche les journaux avant un horodatage (par exemple 2021-08-28T15:23:37Z) ou relatif (par exemple 56m pour 56 minutes)

Exemple :

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28913415ed22 nginx "/docker-entrypoint...." il y a 2 secondes Up 1 second 80/tcp gifted_edison
$ docker logs 28913415ed22
/docker-entrypoint.sh : /docker-entrypoint.d/ n'est pas vide, va tenter d'effectuer la configuration
/docker-entrypoint.sh : Recherche de scripts shell dans /docker-entrypoint.d/
/docker-entrypoint.sh : Lancement de /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh : info : Obtention de la somme de contrôle de /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh : info : Activation de l'écoute sur IPv6 dans /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh : Lancement de /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh : Lancement de /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh : Configuration terminée ; prêt pour le démarrage
2021/08/28 09:02:59 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : utilisation de la méthode d'événement "epoll"
2021/08/28 09:02:59 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : nginx/1.21.1
2021/08/28 09:02:59 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : construit par gcc 8.3.0 (Debian 8.3.0-6)
2021/08/28 09:02:59 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : OS : Linux 5.8.0-1039-azure
2021/08/28 09:02:59 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : getrlimit(RLIMIT_NOFILE) : 1048576:1048576
2021/08/28 09:02:59 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage des processus de travailleur
2021/08/28 09:02:59 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage du processus de travail 31
2021/08/28 09:02:59 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : démarrage du processus de travailleur 32
$

Emplacement des journaux Docker

Docker, par défaut, capture la sortie standard (et l’erreur standard) de tous vos conteneurs et les écrit dans des fichiers en utilisant le format JSON. Ceci est réalisé en utilisant le pilote de journalisation JSON File ou json-file. Ces journaux sont stockés par défaut à des emplacements spécifiques aux conteneurs dans le système de fichiers /var/lib/docker.

/var/lib/docker/containers/<container_id>/<container_id>-json.log

Par exemple, pour mon conteneur redis listé ci-dessous, je peux vérifier son fichier journal json comme indiqué dans l’extrait ci-dessous :

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
551c9273bbea redis "docker-entrypoint.s..." il y a 19 minutes Up 19 minutes 6379/tcp redis
6cc871763df1 nginx "/docker-entrypoint...." il y a 7 heures En cours depuis 7 heures 0.0.0.0:8080->80/tcp, :::8080->80/tcp nostalgic_wescoff
$ sudo ls -l /var/lib/docker/containers/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73-json.log
-rw-r----- 1 root root 1437 Aug 28 16:53 /var/lib/docker/containers/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73-json.log
$ sudo tail -10 /var/lib/docker/containers/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73/551c9273bbea6eaf66523ed735866b9ebe6924c3b504dfeb44bef90e69d59c73-json.log
{"log" : "1:C 28 Aug 2021 16:53:42.160 # oO0OoO0OoOo Redis is starting oO0OoO0Oo\n", "stream" : "stdout", "time" : "2021-08-28T16:53:42.16031257Z"}
{"log" : "1:C 28 Aug 2021 16:53:42.160 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=1, just started\n", "stream" : "stdout", "time" : "2021-08-28T16:53:42.160337871Z"}
{"log" : "1:C 28 Aug 2021 16:53:42.160 # Warning : no config file specified, using the default config. Pour spécifier un fichier de configuration, utilisez redis-server /path/to/redis.conf\n", "stream" : "stdout", "time" : "2021-08-28T16:53:42.160342171Z"}
{"log" : "1:M 28 Aug 2021 16:53:42.160 * horloge monotone : POSIX clock_gettime\n","stream":"stdout","time":"2021-08-28T16:53:42.160792578Z"}
{"log" : "1:M 28 Aug 2021 16:53:42.161 * Running mode=standalone, port=6379.\n", "stream" : "stdout", "time" : "2021-08-28T16:53:42.161148683Z"}
{"log" : "1:M 28 Aug 2021 16:53:42.161 # Server initialized\n", "stream" : "stdout", "time" : "2021-08-28T16:53:42.161170984Z"}
{"log" : "1:M 28 Aug 2021 16:53:42.161 # WARNING overcommit_memory is set to 0 ! L'enregistrement en arrière-plan peut échouer si la mémoire est faible. Pour résoudre ce problème, ajoutez 'vm.overcommit_memory = 1' au fichier /etc/sysctl.conf, puis redémarrez ou exécutez la commande 'sysctl vm.overcommit_memory=1' pour que cela prenne effet.\n", "stream" : "stdout", "time" : "2021-08-28T16:53:42.161186984Z"}
{"log" : "1:M 28 Aug 2021 16:53:42.161 * Prêt à accepter les connexions\n", "stream" : "stdout", "time" : "2021-08-28T16:53:42.161484389Z"}
$

Afficher les détails supplémentaires

Pour afficher les détails supplémentaires fournis aux journaux, utilisez l’option --details.

Exemple : $ docker logs 6cc871763df1 –details

$ docker logs 6cc871763df1 --details
 /docker-entrypoint.sh : /docker-entrypoint.d/ is not empty, will attempt to perform configuration
 /docker-entrypoint.sh : Recherche de scripts shell dans /docker-entrypoint.d/
 /docker-entrypoint.sh : Lancement de /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
 10-listen-on-ipv6-by-default.sh : info : Obtention de la somme de contrôle de /etc/nginx/conf.d/default.conf
 10-listen-on-ipv6-by-default.sh : info : Activation de l'écoute sur IPv6 dans /etc/nginx/conf.d/default.conf
 /docker-entrypoint.sh : Lancement de /docker-entrypoint.d/20-envsubst-on-templates.sh
 /docker-entrypoint.sh : Lancement de /docker-entrypoint.d/30-tune-worker-processes.sh
 /docker-entrypoint.sh : Configuration terminée ; prêt pour le démarrage
 2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : utilisation de la méthode d'événement "epoll"
 2021/08/28 10:29:05 [ <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : nginx/1.21.1
 2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : construit par gcc 8.3.0 (Debian 8.3.0-6)
 2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : OS : Linux 5.8.0-1039-azure
 2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : getrlimit(RLIMIT_NOFILE) : 1048576:1048576
 2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage des processus de travailleur
 2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage du processus de travail 33
 2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : démarrage du processus de travailleur 34
 172.17.0.1 - - [28/Aug/2021:10:29:26 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
$

Suivez la sortie du journal

Vous pouvez utiliser les drapeaux --follow ou -f pour suivre la sortie du journal. Cela vous permet de surveiller les nouvelles mises à jour dans le flux de journaux provenant continuellement de STDOUT et STDERR.

Exemple :

$ docker logs 6cc871763df1 -f
/docker-entrypoint.sh : /docker-entrypoint.d/ n'est pas vide, tentera d'effectuer la configuration
/docker-entrypoint.sh : Recherche de scripts shell dans /docker-entrypoint.d/
/docker-entrypoint.sh : Lancement de /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh : info : Obtention de la somme de contrôle de /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh : info : Activation de l'écoute sur IPv6 dans /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh : Lancement de /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh : Lancement de /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh : Configuration terminée ; prêt pour le démarrage
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : utilisation de la méthode d'événement "epoll"
2021/08/28 10:29:05 [ <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : nginx/1.21.1
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : construit par gcc 8.3.0 (Debian 8.3.0-6)
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : OS : Linux 5.8.0-1039-azure
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : getrlimit(RLIMIT_NOFILE) : 1048576:1048576
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage des processus de travailleur
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage du processus de travail 33
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : démarrage du processus de travailleur 34
172.17.0.1 - - [28/Aug/2021:10:29:26 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"

Journaux de queue

Les journaux des conteneurs peuvent être mis en queue pour limiter le nombre de sorties affichées à l’écran avec l’option --tail ou -n. Par défaut, cet indicateur prend all comme argument, ce qui permet d’afficher le flux de données complet. Pour afficher un nombre fixe de lignes à partir de la fin des journaux, indiquez un nombre entier positif à la suite de l’indicateur --tail ou -n.

Exemple :

$ docker logs 6cc871763df1 -n 10
/docker-entrypoint.sh : Configuration complete ; ready for start up
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Utilisation de la méthode d'événement "epoll"
2021/08/28 10:29:05 [ <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : nginx/1.21.1
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : construit par gcc 8.3.0 (Debian 8.3.0-6)
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : OS : Linux 5.8.0-1039-azure
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : getrlimit(RLIMIT_NOFILE) : 1048576:1048576
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage des processus de travailleur
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage du processus de travail 33
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : démarrage du processus de travailleur 34
172.17.0.1 - - [28/Aug/2021:10:29:26 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
$

Afficher les journaux depuis

Nous pouvons limiter la sortie des journaux en utilisant l’option --since et en donnant un timestamp comme une valeur absolue avec la syntaxe 2021-08-28T15:23:37Z ou une valeur relative comme 56m pour 56 minutes.

L’option --since n’affiche que les journaux de conteneurs générés après une date donnée. Vous pouvez spécifier la date sous la forme d’une date RFC 3339, d’un horodatage UNIX ou d’une chaîne de durée Go (par exemple, 1m30s, 3h). Le fuseau horaire local du client sera utilisé si vous ne fournissez pas un Z ou un décalage de fuseau horaire de -00:00 à la fin de l’horodatage. Vous pouvez combiner l’option --since avec l’une ou l’autre des options --follow ou --tail, ou les deux.

Exemple :

$ docker logs --since=1m nostalgic_wescoff
172.17.0.1 - - [28/Aug/2021:15:19:24 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
172.17.0.1 - - [28/Aug/2021:15:19:25 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
$

Dans l’exemple ci-dessus, les logs depuis seulement 2 minutes sont affichés où nostalgic_wescoff est le nom auto-généré assigné au conteneur nginx.

Afficher les journaux jusqu’à

Comme l’option --since, docker logs supporte également l’option --until, qui affiche les logs avant l’horodatage donné. De même, l’horodatage suit une convention similaire à la précédente et peut être spécifié comme une valeur absolue avec la syntaxe 2021-08-28T15:23:37Z ou une valeur relative comme 56m pour 56 minutes.

Exemple : $ docker logs –until

$ docker logs --until=1h30m nostalgic_wescoff
/docker-entrypoint.sh : /docker-entrypoint.d/ n'est pas vide, tentera d'effectuer la configuration
/docker-entrypoint.sh : Recherche de scripts shell dans /docker-entrypoint.d/
/docker-entrypoint.sh : Lancement de /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh
10-listen-on-ipv6-by-default.sh : info : Obtention de la somme de contrôle de /etc/nginx/conf.d/default.conf
10-listen-on-ipv6-by-default.sh : info : Activation de l'écoute sur IPv6 dans /etc/nginx/conf.d/default.conf
/docker-entrypoint.sh : Lancement de /docker-entrypoint.d/20-envsubst-on-templates.sh
/docker-entrypoint.sh : Lancement de /docker-entrypoint.d/30-tune-worker-processes.sh
/docker-entrypoint.sh : Configuration terminée ; prêt pour le démarrage
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : utilisation de la méthode d'événement "epoll"
2021/08/28 10:29:05 [ <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : nginx/1.21.1
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : construit par gcc 8.3.0 (Debian 8.3.0-6)
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : OS : Linux 5.8.0-1039-azure
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : getrlimit(RLIMIT_NOFILE) : 1048576:1048576
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage des processus de travailleur
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : Démarrage du processus de travail 33
2021/08/28 10:29:05 <x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x><x>[notice]</x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x></x> 1#1 : démarrage du processus de travailleur 34
172.17.0.1 - - [28/Aug/2021:10:29:26 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
$

Dans l’exemple ci-dessus, tous les journaux antérieurs à 1 heure 30 minutes sont affichés.

Afficher les horodatages

De nombreuses applications de conteneurs offrent des horodatages intégrés dans leur sortie de journal, de sorte que Docker les affiche également avec la commande docker logs. Si vous avez besoin que Docker préfixe explicitement ses horodatages dans la sortie, utilisez les drapeaux --timestamps ou -t.

Exemple :

$ docker logs -t redis
2021-08-28T16:53:42.160312570Z 1:C 28 Aug 2021 16:53:42.160 # oO0OoO0OoOo Redis démarre oO0OoOo0Oo
2021-08-28T16:53:42.160337871Z 1:C 28 Aug 2021 16:53:42.160 # Redis version=6.2.5, bits=64, commit=00000000, modified=0, pid=1, vient de démarrer
2021-08-28T16:53:42.160342171Z 1:C 28 Aug 2021 16:53:42.160 # Warning : no config file specified, using the default config. Pour spécifier un fichier de configuration, utilisez redis-server /path/to/redis.conf
2021-08-28T16:53:42.160792578Z 1:M 28 Aug 2021 16:53:42.160 * horloge monotone : POSIX clock_gettime
2021-08-28T16:53:42.161148683Z 1:M 28 Aug 2021 16:53:42.161 * Running mode=standalone, port=6379.
2021-08-28T16:53:42.161170984Z 1:M 28 Aug 2021 16:53:42.161 # Serveur initialisé
2021-08-28T16:53:42.161186984Z 1:M 28 Aug 2021 16:53:42.161 # WARNING overcommit_memory is set to 0 ! L'enregistrement en arrière-plan peut échouer si la mémoire est faible. Pour corriger ce problème, ajoutez 'vm.overcommit_memory = 1' au fichier /etc/sysctl.conf et redémarrez ou exécutez la commande 'sysctl vm.overcommit_memory=1' pour que cela prenne effet.
2021-08-28T16:53:42.161484389Z 1:M 28 Aug 2021 16:53:42.161 * Prêt à accepter des connexions
$

Drapeaux de fusion

Docker propose de combiner certains drapeaux pour obtenir une sortie plus filtrée plutôt que d’imprimer tout le contenu du journal à l’écran. Par exemple, nous pouvons combiner le drapeau --tail avec --since pour obtenir une sortie plus restreinte.

Exemple : $ docker logs –since

$ docker logs --since=2h -f nostalgic_wescoff
172.17.0.1 - - [28/Aug/2021:15:19:24 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
172.17.0.1 - - [28/Aug/2021:15:19:25 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"

Cela peut également fonctionner avec d’autres drapeaux.

Filtrer avec les utilitaires Shell

Les utilitaires de l’interpréteur de commandes de Linux peuvent également être utilisés pour plus de dextérité dans la sortie des journaux. Des utilitaires comme grep, head, tail, etc. peuvent être acheminés vers la sortie des logs de docker pour des opérations plus avancées.

Exemple : $ docker logs –since :

$ docker logs --since=7h nostalgic_wescoff 2>&1 | grep GET
172.17.0.1 - - [28/Aug/2021:10:29:26 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
172.17.0.1 - - [28/Aug/2021:15:19:24 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
172.17.0.1 - - [28/Aug/2021:15:19:25 0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"
$

Notez ici que nous devons rediriger les flux de logs pour fournir une entrée unique pour grep en utilisant 2>&1.

Résumé 👩‍💻

Docker est une plateforme polyvalente qui offre de nombreuses fonctionnalités pour administrer son environnement. La gestion des logs d’un système est l’une des compétences essentielles que tout administrateur système doit connaître. La gestion des logs dans Docker est facile une fois que vous connaissez les commandes disponibles et les drapeaux possibles en fonction de vos besoins.

Pour en savoir plus sur Docker et ses fonctionnalités, consultez la documentation de Docker.