Рубрики
Без рубрики

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

Быстрый и практичный учебник по доступу к журналам Spring Boot Docker.

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