Jak sprawdzić dzienniki Dockera?
Opublikowany: 2021-08-30Docker, popularna platforma do wirtualizacji na poziomie systemu operacyjnego, która pozwala nam dostarczać aplikacje w pakietach zwanych kontenerami, które w uproszczeniu są odizolowanymi środowiskami z własnym oprogramowaniem, bibliotekami i plikami konfiguracyjnymi.
Jak każde inne nowoczesne oprogramowanie, rejestrowanie zdarzeń i komunikatów, takich jak ostrzeżenia i błędy, jest nieodłączną częścią platformy Docker, która umożliwia debugowanie aplikacji i problemów produkcyjnych.
Omówimy kilka prostych sposobów zarządzania dziennikami kontenerów i monitorowania ich. Więc zacznijmy.
Polecenie dzienników Docker
Podstawowa składnia do pobierania dzienników kontenera to:
$ docker logs [OPTIONS] <CONTAINER-NAME OR ID>LUB
$ docker container logs [OPTIONS] <CONTAINER-NAME OR ID> Obie składnie są zasadniczo takie same, więc skupimy się na pozostałych poleceniach w tym artykule jako docker logs .
Choć należy pamiętać, że powyższe tu komenda działa tylko w opakowaniach, które zostały uruchomione za pomocą json-file lub journald kierowcy rejestrowania.
Tutaj OPTIONS odnoszą się do dostępnych obsługiwanych flag z poleceniem docker logs , które są wymienione poniżej:
| Imię i nazwisko, skrótowe | Domyślna | Opis |
|---|---|---|
--details | Pokaż dodatkowe szczegóły dostarczone do logów. | |
--follow , -f | Śledź dane wyjściowe dziennika | |
--since | Pokaż logi od sygnatury czasowej (np. 2021-08-28T15:23:37Z) lub względnej (np. 56m przez 56 minut) | |
--tail , -n | all | Liczba wierszy do wyświetlenia od końca dzienników |
--timestamps, -t | Pokaż sygnatury czasowe | |
--until | API 1.35+ Pokaż logi przed sygnaturą czasową (np. 2021-08-28T15:23:37Z) lub względną (np. 56m przez 56 minut) |
Przykład:
$ 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 $Lokalizacja dzienników platformy Docker
Docker domyślnie przechwytuje standardowe wyjście (i błąd standardowy) wszystkich kontenerów i zapisuje je w plikach w formacie JSON. Osiąga się to za pomocą sterownika rejestrowania plików JSON lub pliku json. Te dzienniki są domyślnie przechowywane w lokalizacjach specyficznych dla kontenera w systemie plików /var/lib/docker .
/var/lib/docker/containers/<container_id>/<container_id>-json.log Na przykład dla mojego kontenera redis wymienionego poniżej mogę sprawdzić jego json dziennika json jak pokazano na poniższym fragmencie:
$ 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"} $Pokaż dodatkowe szczegóły
Aby wyświetlić dodatkowe szczegóły dostarczane do dzienników, użyj flagi --details .
Przykład:
$ 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" "-" $Śledź wyjście dziennika
Możesz użyć flagi --follow lub -f aby śledzić dane wyjściowe dziennika. Pozwala to na ciągłe monitorowanie nowych aktualizacji w strumieniu dziennika z STDOUT i STDERR .
Przykład:
$ 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" "-"Dzienniki ogonowe
Dzienniki kontenerów mogą być tailed, aby ograniczyć liczbę danych wyjściowych wyświetlanych na ekranie za -n flagi --tail lub -n . Domyślnie ta flaga przyjmuje all jako argument, który pokazuje cały strumień dziennika. Aby wyświetlić stałą liczbę wierszy od końca dzienników, podaj dodatnią liczbę całkowitą po --tail lub -n .

Przykład:
$ 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" "-" $Pokaż dzienniki od
Możemy ograniczyć wyjście dziennika, używając flagi --since i podając znacznik czasu, taki jak wartość bezwzględna ze składnią 2021-08-28T15:23:37Z lub względną, np. 56m przez 56 minut.
Opcja --since pokazuje tylko logi kontenera wygenerowane po określonej dacie. Możesz określić datę jako datę RFC 3339, znacznik czasu UNIX lub ciąg czasu trwania Go (np. 1m30s , 3h ). Lokalna strefa czasowa klienta zostanie użyta, jeśli na końcu sygnatury czasowej nie zostanie podane przesunięcie strefy czasowej Z ani +-00:00 . Możesz połączyć opcję --since z jedną lub obiema opcjami --follow lub --tail .
Przykład:
$ 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" "-" $ W powyższym przykładzie pokazane są logi z zaledwie 2 minut, gdzie nostalgic_wescoff to automatycznie generowana nazwa przypisana do kontenera nginx .
Pokaż dzienniki do
Podobnie --since flaga --since , docker logs --until obsługują również flagę --until , która pokazuje dzienniki przed podanym znacznikiem czasu. Podobnie sygnatura 2021-08-28T15:23:37Z jest zgodna z podobną konwencją jak wcześniej i może być określona jako wartość bezwzględna ze składnią 2021-08-28T15:23:37Z lub względną, na przykład 56m przez 56 minut.
Przykład:
$ 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" "-" $W powyższym przykładzie pokazane są wszystkie dzienniki sprzed 1 godziny 30 minut.
Pokaż sygnatury czasowe
Wiele aplikacji kontenerowych oferuje sygnatury czasowe wbudowane w dane wyjściowe dziennika, więc Docker pokazuje je również za pomocą polecenia Docker docker logs . Jeśli potrzebujesz platformy Docker, aby wyraźnie poprzedzić swoje znaczniki czasu w danych wyjściowych, użyj opcji --timestamps lub -t .
Przykład:
$ 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 $Połącz flagi
Docker oferuje łączenie niektórych flag, aby uzyskać bardziej przefiltrowane dane wyjściowe, zamiast drukowania całej zawartości dziennika na ekranie. Jako prosty przykład, możemy połączyć --tail flagę z --since dostać wyjście bardziej ograniczone.
Przykład:
$ 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" "-"Może to działać również z innymi flagami.
Filtruj za pomocą narzędzi powłoki
Narzędzia powłoki Linuksa mogą być również używane dla większej zręczności w wynikach dziennika. Narzędzia takie jak grep , head , tail itp. mogą być przesyłane do danych wyjściowych docker logs celu uzyskania bardziej zaawansowanych operacji.
Przykład:
$ 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" "-" $ Zwróć uwagę, że musimy przekierować strumienie logów, aby zapewnić pojedynczym potokiem dane wejściowe dla grep za pomocą 2>&1 .
Streszczenie
Docker to wszechstronna platforma oferująca wiele funkcji do administrowania swoim środowiskiem. Zarządzanie logami systemu to jedna z podstawowych umiejętności, które powinien znać każdy administrator systemu. Zarządzanie dziennikami w Dockerze jest łatwe, gdy znasz dostępne polecenia i możliwe flagi zgodnie z wymaganiami.
Więcej informacji na temat platformy Docker i jego funkcji można znaleźć w dokumentacji platformy Docker.
