«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.

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

Теперь давайте настроим наше приложение 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 статьи:

$> 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, поскольку контейнеры не имеют тех же ограничений, что и обычные серверы.