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