Cum se verifică jurnalele Docker?

Publicat: 2021-08-30

Docker, o platformă populară de virtualizare la nivel de sistem de operare care ne permite să furnizăm aplicații în pachete cunoscute sub numele de containere care, în termeni simpli, sunt medii izolate cu propriul software, biblioteci și fișiere de configurare.

Ca orice alt software modern, înregistrarea evenimentelor și mesajelor precum avertismentele și erorile este o parte inerentă a platformei Docker, care vă permite să vă depanați aplicațiile și problemele de producție.

Vom acoperi câteva moduri simple prin care puteți gestiona și monitoriza jurnalele pentru containerele dvs. Asadar, haideti sa începem.

Comanda Docker Logs

Sintaxa de bază pentru a prelua jurnalele unui container este:

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

SAU

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

Ambele sintaxe sunt în esență aceleași, așa că ne vom concentra pe restul comenzilor din acest articol ca docker logs .

Deși face nota aici că comanda de mai sus este funcțional numai pentru containere care sunt pornite cu json-file sau journald driverul de logare.

Aici OPTIONS se referă la semnalizatoarele acceptate disponibile cu comanda docker logs , care sunt enumerate mai jos:

Nume, stenografie Mod implicit Descriere
--details Afișați detalii suplimentare furnizate jurnalelor.
--follow , -f Urmăriți rezultatul jurnalului
--since Afișați jurnalele de la marcajul de timp (de ex. 2021-08-28T15:23:37Z) sau relativ (de ex. 56m timp de 56 de minute)
--tail , -n all Numărul de rânduri de afișat de la sfârșitul jurnalelor
--timestamps, -t Afișați marcajele de timp
--until API 1.35+
Afișați jurnalele înaintea unui marcaj temporal (de exemplu, 2021-08-28T15:23:37Z) sau a unei rude (de exemplu, 56m timp de 56 de minute)

Exemplu:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 28913415ed22 nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 80/tcp gifted_edison $ docker logs 28913415ed22 /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2021/08/28 09:02:59 [notice] 1#1: using the "epoll" event method 2021/08/28 09:02:59 [notice] 1#1: nginx/1.21.1 2021/08/28 09:02:59 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6) 2021/08/28 09:02:59 [notice] 1#1: OS: Linux 5.8.0-1039-azure 2021/08/28 09:02:59 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2021/08/28 09:02:59 [notice] 1#1: start worker processes 2021/08/28 09:02:59 [notice] 1#1: start worker process 31 2021/08/28 09:02:59 [notice] 1#1: start worker process 32 $

Docker Logs Locație

Docker, în mod implicit, captează rezultatul standard (și eroarea standard) a tuturor containerelor și le scrie în fișiere folosind formatul JSON. Acest lucru se realizează folosind driverul de înregistrare a fișierelor JSON sau fișierul json. Aceste jurnale sunt stocate în mod implicit în locații specifice containerului, sub /var/lib/docker .

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

De exemplu, pentru containerul meu redis enumerat mai jos, pot verifica fișierul json acestuia, așa cum se arată în fragmentul de mai jos:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 551c9273bbea redis "docker-entrypoint.s…" 19 minutes ago Up 19 minutes 6379/tcp redis 6cc871763df1 nginx "/docker-entrypoint.…" 7 hours ago Up 7 hours 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 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo\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. In order to specify a config file use 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 * monotonic clock: 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! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.\n","stream":"stdout","time":"2021-08-28T16:53:42.161186984Z"} {"log":"1:M 28 Aug 2021 16:53:42.161 * Ready to accept connections\n","stream":"stdout","time":"2021-08-28T16:53:42.161484389Z"} $

Afișați detalii suplimentare

Pentru a afișa detalii suplimentare furnizate jurnalelor, utilizați --details .

Exemplu:

 $ docker logs 6cc871763df1 --details /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2021/08/28 10:29:05 [notice] 1#1: using the "epoll" event method 2021/08/28 10:29:05 [notice] 1#1: nginx/1.21.1 2021/08/28 10:29:05 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6) 2021/08/28 10:29:05 [notice] 1#1: OS: Linux 5.8.0-1039-azure 2021/08/28 10:29:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2021/08/28 10:29:05 [notice] 1#1: start worker processes 2021/08/28 10:29:05 [notice] 1#1: start worker process 33 2021/08/28 10:29:05 [notice] 1#1: start worker process 34 172.17.0.1 - - [28/Aug/2021:10:29:26 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-" $

Urmăriți ieșirea jurnalului

Puteți utiliza --follow sau -f pentru a urmări rezultatul jurnalului. Acest lucru vă permite să monitorizați noile actualizări în fluxul de jurnal de la STDOUT și STDERR continuu.

Exemplu:

 $ docker logs 6cc871763df1 -f /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2021/08/28 10:29:05 [notice] 1#1: using the "epoll" event method 2021/08/28 10:29:05 [notice] 1#1: nginx/1.21.1 2021/08/28 10:29:05 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6) 2021/08/28 10:29:05 [notice] 1#1: OS: Linux 5.8.0-1039-azure 2021/08/28 10:29:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2021/08/28 10:29:05 [notice] 1#1: start worker processes 2021/08/28 10:29:05 [notice] 1#1: start worker process 33 2021/08/28 10:29:05 [notice] 1#1: start worker process 34 172.17.0.1 - - [28/Aug/2021:10:29:26 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-"

Bușteni de coadă

Jurnalele de containere pot fi urmărite pentru a limita numărul de rezultate afișate pe ecran cu --tail sau -n . În mod implicit, acest flag presupune all ca un argument care arată fluxul de jurnal complet. Pentru a afișa un număr fix de linii de la sfârșitul jurnalelor, specificați un număr întreg pozitiv după --tail sau -n .

Exemplu:

 $ docker logs 6cc871763df1 -n 10 /docker-entrypoint.sh: Configuration complete; ready for start up 2021/08/28 10:29:05 [notice] 1#1: using the "epoll" event method 2021/08/28 10:29:05 [notice] 1#1: nginx/1.21.1 2021/08/28 10:29:05 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6) 2021/08/28 10:29:05 [notice] 1#1: OS: Linux 5.8.0-1039-azure 2021/08/28 10:29:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2021/08/28 10:29:05 [notice] 1#1: start worker processes 2021/08/28 10:29:05 [notice] 1#1: start worker process 33 2021/08/28 10:29:05 [notice] 1#1: start worker process 34 172.17.0.1 - - [28/Aug/2021:10:29:26 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-" $

Afișați jurnalele de când

Putem limita ieșirea jurnalului utilizând --since flag și dând un marcaj de timp, cum ar fi o valoare absolută, cu sintaxa 2021-08-28T15:23:37Z sau una relativă, cum ar fi 56m pentru 56 de minute.

Opțiunea --since arată numai jurnalele de containere generate după o dată dată. Puteți specifica data ca dată RFC 3339, marcaj temporal UNIX sau șir de durată Go (de exemplu, 1m30s , 3h ). Fusul orar local al clientului va fi utilizat dacă nu furnizați nici un Z sau un decalaj al fusului orar +-00:00 la sfârșitul marcajului de timp. Puteți combina --since opțiunea cu una sau ambele --follow sau --tail opțiuni.

Exemplu:

 $ 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" "-" $

În exemplul de mai sus, sunt afișate jurnalele de numai 2 minute, unde nostalgic_wescoff este numele generat automat atribuit containerului nginx .

Afișați jurnalele până la

La fel ca --since flag, docker logs --until acceptă și --until flag, care arată jurnalele înainte de marcajul de timp dat. În mod similar, marcajul de timp urmează o convenție similară ca mai devreme și poate fi specificată ca o valoare absolută cu sintaxa 2021-08-28T15:23:37Z sau una relativă precum 56m timp de 56 de minute.

Exemplu:

 $ docker logs --until=1h30m nostalgic_wescoff /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration /docker-entrypoint.sh: Looking for shell scripts in /docker-entrypoint.d/ /docker-entrypoint.sh: Launching /docker-entrypoint.d/10-listen-on-ipv6-by-default.sh 10-listen-on-ipv6-by-default.sh: info: Getting the checksum of /etc/nginx/conf.d/default.conf 10-listen-on-ipv6-by-default.sh: info: Enabled listen on IPv6 in /etc/nginx/conf.d/default.conf /docker-entrypoint.sh: Launching /docker-entrypoint.d/20-envsubst-on-templates.sh /docker-entrypoint.sh: Launching /docker-entrypoint.d/30-tune-worker-processes.sh /docker-entrypoint.sh: Configuration complete; ready for start up 2021/08/28 10:29:05 [notice] 1#1: using the "epoll" event method 2021/08/28 10:29:05 [notice] 1#1: nginx/1.21.1 2021/08/28 10:29:05 [notice] 1#1: built by gcc 8.3.0 (Debian 8.3.0-6) 2021/08/28 10:29:05 [notice] 1#1: OS: Linux 5.8.0-1039-azure 2021/08/28 10:29:05 [notice] 1#1: getrlimit(RLIMIT_NOFILE): 1048576:1048576 2021/08/28 10:29:05 [notice] 1#1: start worker processes 2021/08/28 10:29:05 [notice] 1#1: start worker process 33 2021/08/28 10:29:05 [notice] 1#1: start worker process 34 172.17.0.1 - - [28/Aug/2021:10:29:26 +0000] "GET / HTTP/1.1" 200 612 "-" "curl/7.68.0" "-" $

În exemplul de mai sus, sunt afișate toate jurnalele înainte de 1 oră și 30 de minute.

Afișați marcajele de timp

Multe aplicații container oferă marcaje de timp încorporate în ieșirea lor de jurnal, așa că Docker le arată și cu comanda docker logs . Dacă aveți nevoie de Docker să prefixeze în mod explicit marcajele de timp în rezultat, utilizați --timestamps sau -t .

Exemplu:

 $ docker logs -t redis 2021-08-28T16:53:42.160312570Z 1:C 28 Aug 2021 16:53:42.160 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo 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, just started 2021-08-28T16:53:42.160342171Z 1:C 28 Aug 2021 16:53:42.160 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf 2021-08-28T16:53:42.160792578Z 1:M 28 Aug 2021 16:53:42.160 * monotonic clock: 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 # Server initialized 2021-08-28T16:53:42.161186984Z 1:M 28 Aug 2021 16:53:42.161 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect. 2021-08-28T16:53:42.161484389Z 1:M 28 Aug 2021 16:53:42.161 * Ready to accept connections $

Îmbinați steaguri

Docker oferă să combine anumite steaguri pentru a obține o ieșire mai filtrată, mai degrabă decât să imprime tot conținutul jurnalului pe ecran. Ca exemplu simplu, putem combina --tail flag cu --since pentru a obține o ieșire mai restricționată.

Exemplu:

 $ 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" "-"

Acest lucru poate funcționa și cu alte steaguri.

Filtrați cu utilități Shell

Utilitare shell Linux pot fi, de asemenea, utilizate pentru mai multă dexteritate în ieșirea jurnalului. Utilități precum grep , head , tail etc. pot fi transmise la ieșirea docker logs pentru operațiuni mai avansate.

Exemplu:

 $ 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" "-" $

Rețineți că trebuie să redirecționăm fluxurile de jurnal pentru a oferi o intrare cu o singură conductă pentru grep folosind 2>&1 .

rezumat

Docker este o platformă versatilă care oferă numeroase funcții pentru a-și administra mediul. Gestionarea jurnalelor pentru un sistem este una dintre abilitățile esențiale pe care fiecare administrator de sistem ar trebui să le cunoască. Gestionarea jurnalelor în Docker este ușoară odată ce cunoașteți comanda disponibilă și posibilele semnalizări conform cerințelor dvs.

Pentru a citi mai multe despre Docker și funcționalitățile sale, consultați documentația Docker.