Skip to content

Сбор логов при использовании Docker (без оркестраторов)

Подсистема ЖУРНАЛЛИСТ может принимать журналы от контейнеров Docker без использования дополнительных инструментов (Fluentd, Kubernetes и др.). Достаточно настроить стандартные механизмы Docker и/или системного syslog.

Общие варианты

При использовании Docker доступны два базовых подхода:

  1. Использование logging driver syslog (рекомендуется)
  2. Использование stdout/stderr + системный syslog (rsyslog/syslog-ng)

Вариант 1. Logging driver syslog

Docker поддерживает встроенный драйвер логирования syslog, который напрямую отправляет stdout/stderr контейнера в сервер ЖУРНАЛЛИСТ.

Пример запуска контейнера

bash
docker run -d \
  --name myapp \
  --log-driver=syslog \
  --log-opt syslog-address="tcp://journalist-server:514" \
  --log-opt tag="myapp" \
  myapp:latest

Вариант с UDP

bash
docker run -d \
  --name myapp \
  --log-driver=syslog \
  --log-opt syslog-address="udp://journalist-server:514" \
  --log-opt tag="myapp" \
  myapp:latest

Дополнительные параметры

bash
--log-opt syslog-format=rfc5424
--log-opt syslog-facility=daemon

Что происходит

  • Docker перехватывает stdout/stderr контейнера
  • преобразует в syslog-сообщения
  • отправляет напрямую в ЖУРНАЛЛИСТ

Плюсы

  • простая настройка
  • нет дополнительных компонентов
  • минимальная задержка

Ограничения

  • ограниченные возможности фильтрации
  • нет буферизации
  • зависимость от сети (особенно при UDP)

Вариант 2. Через системный syslog узла

Контейнеры пишут в stdout/stderr, а Docker сохраняет логи локально (обычно в JSON-файлы). Далее системный syslog (rsyslog / syslog-ng) отправляет их в ЖУРНАЛЛИСТ.

Где лежат логи Docker

bash
/var/lib/docker/containers/<container-id>/<container-id>-json.log

Пример rsyslog

bash
# /etc/rsyslog.d/docker.conf

input(type="imfile"
      File="/var/lib/docker/containers/*/*.log"
      Tag="docker"
      Facility="local0")

*.* @@journalist-server:514

Перезапуск:

bash
systemctl restart rsyslog

Плюсы

  • гибкая фильтрация
  • буферизация
  • централизованное управление

Минусы

  • дополнительная настройка
  • небольшая задержка

Вариант 3. Отправка логов из приложения

Если приложение внутри контейнера поддерживает syslog, оно может отправлять сообщения напрямую:

bash
echo "<14>Test message from container" > /dev/udp/journalist-server/514

или через logger:

bash
logger -n journalist-server "App message"

Рекомендации

Для большинства сценариев:

  • использовать logging driver syslog (TCP)
  • задавать осмысленные tag (имя сервиса)
  • контролировать объем логов

Для production:

  • использовать TCP
  • при необходимости — промежуточный syslog (rsyslog)
  • разделять потоки по сервисам

Когда этого достаточно

Подход без Compose/Swarm/K8s подходит для:

  • отдельных серверов
  • простых сервисов
  • edge-узлов
  • тестовых и пилотных внедрений

Когда стоит усложнять

Дополнительные инструменты (Fluentd, Kafka и др.) могут понадобиться, если:

  • большой поток данных
  • сложная маршрутизация
  • необходимость буферизации
  • мультикластерная архитектура

Краткий вывод

Даже при использовании «чистого» Docker можно организовать полноценную интеграцию с подсистемой ЖУРНАЛЛИСТ — за счет встроенного syslog-драйвера или системных средств Linux.

Это позволяет быстро подключить контейнеры к централизованной системе анализа журналов без усложнения архитектуры.