Перейти к основному содержимому

Доступ к журналам загрузки Spring в Docker

· 4 мин. чтения

1. Обзор

В этом руководстве мы объясним, как получить доступ к журналам Spring Boot в Docker, от локальной разработки до надежных многоконтейнерных решений.

2. Основной консольный вывод

Для начала соберём наш образ Spring Boot Docker из нашей предыдущей статьи :

$> mvn spring-boot:build-image

Затем, когда мы запустим наш контейнер, мы сможем сразу увидеть в консоли логи STDOUT :

$> docker run --name=demo-container docker.io/library/spring-boot-docker:0.0.1-SNAPSHOT
Setting Active Processor Count to 1
WARNING: Container memory limit unset. Configuring JVM for 1G container.

Эта команда следует за журналами, как команда tail -f оболочки Linux .

Теперь давайте настроим наше приложение Spring Boot с добавлением файла журнала, добавив строку в файл application.properties :

logging.file.path=logs

Затем мы можем получить тот же результат, выполнив команду tail -f в нашем работающем контейнере:

$> docker exec -it demo-container tail -f /workspace/logs/spring.log > $HOME/spring.log
Setting Active Processor Count to 1
WARNING: Container memory limit unset. Configuring JVM for 1G container.

Вот и все для одноконтейнерных решений. В следующих главах мы узнаем, как анализировать историю журнала и вывод журнала из составных контейнеров.

3. Том Docker для файлов журнала

Если нам необходимо получить доступ к файлам журнала из файловой системы хоста, мы должны создать том Docker .

Для этого мы можем запустить контейнер нашего приложения с помощью команды:

$> mvn spring-boot:build-image -v /path-to-host:/workspace/logs

Затем мы можем увидеть файл spring.log в каталоге /path-to-host .

Начиная с нашей предыдущей статьи о Docker Compose , мы можем запускать несколько контейнеров из файла Docker Compose.

Если мы используем файл Docker Compose, мы должны добавить конфигурацию томов:

network-example-service-available-to-host-on-port-1337:
image: karthequian/helloworld:latest
container_name: network-example-service-available-to-host-on-port-1337
volumes:
- /path-to-host:/workspace/logs

Затем запустим статью Compose file:

$> docker-compose up

Файлы журнала доступны в каталоге /path-to-host .

Теперь, когда мы рассмотрели основные решения, давайте рассмотрим более продвинутую команду docker logs .

В следующих главах мы предполагаем, что наше приложение Spring Boot настроено на печать журналов в STDOUT.

4. Журналы Docker для нескольких контейнеров

Как только мы запустим несколько контейнеров одновременно, мы больше не сможем читать смешанные журналы из нескольких контейнеров.

Мы можем найти в документации Docker Compose, что контейнеры настроены по умолчанию с драйвером журнала json-file , который поддерживает команду docker logs .

Давайте посмотрим, как это работает на нашем примере с Docker Compose .

Во-первых, давайте найдем наш идентификатор контейнера:

$> docker ps
CONTAINER ID IMAGE COMMAND
877bb028a143 karthequian/helloworld:latest "/runner.sh nginx"

Затем мы можем отобразить журналы нашего контейнера с помощью команды docker logs -f . Мы видим, что, несмотря на драйвер json-файла , вывод по-прежнему представляет собой обычный текст — JSON используется только внутри Docker:

$> docker logs -f 877bb028a143
172.27.0.1 - - [22/Oct/2020:11:19:52 +0000] "GET / HTTP/1.1" 200 4369 "
172.27.0.1 - - [22/Oct/2020:11:19:52 +0000] "GET / HTTP/1.1" 200 4369 "

Параметр -f ведет себя так же, как команда оболочки tail -f : он повторяет вывод журнала по мере его создания.

Обратите внимание: если мы запускаем наши контейнеры в режиме Swarm, вместо этого мы должны использовать команды docker service ps и docker service logs .

В документации мы видим, что команда docker logs поддерживает ограниченные параметры вывода: json-file , local или journald .

5. Драйверы Docker для служб агрегации журналов

Команда docker logs особенно полезна для мгновенного просмотра: она не предоставляет сложных фильтров или долгосрочной статистики.

Для этой цели Docker поддерживает несколько драйверов службы агрегации журналов . Как мы изучали Graylog в предыдущей статье , настроим соответствующий драйвер для этой платформы.

Эта конфигурация может быть глобальной для хоста в файле daemon.json . Он находится в /etc/docker на хостах Linux или в C:\ProgramData\docker\config на серверах Windows.

Обратите внимание, что мы должны создать файл daemon.json , если он не существует:

{ 
"log-driver": "gelf",
"log-opts": {
"gelf-address": "udp://1.2.3.4:12201"
}
}

Драйвер Graylog называется GELF — мы просто указываем IP-адрес нашего экземпляра Graylog.

Мы также можем переопределить эту конфигурацию при запуске одного контейнера :

$> docker run \
--log-driver gelf –-log-opt gelf-address=udp://1.2.3.4:12201 \
alpine echo hello world

6. Заключение

В этой статье мы рассмотрели различные способы доступа к журналам Spring Boot в Docker.

Ведение журнала в STDOUT упрощает просмотр журнала при выполнении в одном контейнере.

Однако использование файловых приложений — не лучший вариант, если мы хотим извлечь выгоду из функций ведения журнала Docker, поскольку контейнеры не имеют тех же ограничений, что и обычные серверы.