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.