Автор оригинала: Benjamin Caure.
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 shell tail-f .
Теперь давайте настроим наше приложение Spring Boot с помощью приложения log file appender, добавив строку в файл 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 log, который поддерживает команду docker logs .
Давайте посмотрим, как это работает с нашим примером Docker Compose .
Во-первых, давайте узнаем идентификатор контейнера:
$> docker ps CONTAINER ID IMAGE COMMAND 877bb028a143 karthequian/helloworld:latest "/runner.sh nginx"
Затем мы можем отобразить наши журналы контейнеров с помощью команды docker logs-f . Мы видим, что, несмотря на драйвер json-file , вывод по — прежнему является простым текстом-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 shell: она повторяет вывод журнала по мере его создания.
Обратите внимание, что если мы запускаем наши контейнеры в режиме роя, мы должны использовать вместо этого команды docker service ps и docker service logs .
В документации мы видим, что команда docker logs поддерживает ограниченные параметры вывода: json-file , local, или journald .
5. Драйверы Docker для служб агрегации журналов
Команда docker logs особенно полезна для мгновенного просмотра: она не предоставляет сложных фильтров или долгосрочной статистики.
Для этой цели Docker поддерживает несколько драйверов службы агрегации журналов . Как мы изучали Graylog в предыдущей статье, мы настроим соответствующий драйвер для этой платформы.
Эта конфигурация может быть глобальной для хоста в демоне .json файл . Он находится в /etc/docker на хостах Linux или C:\ProgramData\docker\config на серверах Windows.
Обратите внимание, что мы должны создать демон .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, поскольку контейнеры не имеют тех же ограничений, что и обычные серверы.