Назад | Перейти на главную страницу

Как переслать логи контейнера Docker в ELK?

Я хотел бы знать, как проще всего переслать журналы контейнера докеров на сервер ELK, пока решения, которые я пробовал после поиска в Интернете, вообще не работали.

В основном у меня есть образ докера, который я запускаю с помощью docker-compose, этот контейнер ничего не регистрирует локально (он состоит из разных служб, но ни один из них не является logstash или чем-то еще), но я вижу, как docker logs -tf imageName или docker-compose logs. Поскольку я запускаю контейнеры с помощью compose, я не могу использовать (или, по крайней мере, не знаю, как) --logs-driver вариант докера.

Таким образом, мне было интересно, может ли кто-нибудь немного просветить меня относительно того, как, например, пересылать эти журналы в контейнер ELK.

Заранее спасибо,

С уважением

РЕШЕНИЕ:

Благодаря madeddie я смог решить свою проблему следующим образом, упомянув, что я использовал базовый ELK-stack-in-container, который madeddie предложил в своем сообщении.

Сначала я обновляю docker-compose.yml файл моего контейнера, чтобы добавить записи для ссылки на ведение журнала, как сказал мне madeddie, я включил запись для каждой службы, фрагмент моего docker-compose выглядит так

   version: '2'
    services:
      mosquitto:
        image: ansi/mosquitto
        ports:
          - "1883:1883" # Public access to MQTT
          - "12202:12202"  #mapping logs
        logging: 
           driver: gelf
           options: 
             gelf-address: udp://localhost:12202
    redis:
     image: redis
     command: redis-server --appendonly yes
     ports:
       - "6379:6379" # No public access to Redis
       - "12203:12203" #mapping logs
     volumes:
       - /home/dockeruser/redis-data:/data
     logging: 
       driver: gelf
       options: 
         gelf-address: udp://localhost:12203 

Во-вторых, мне пришлось использовать другой номер порта для каждой службы, чтобы иметь возможность пересылать журналы.

Наконец-то я обновил контейнер для лося docker-compose.yml файл для сопоставления каждого порта обновления, где я отправлял свои журналы, на тот, который прослушивает logstash

logstash:
  build: logstash/
  command: logstash -f /etc/logstash/conf.d/logstash.conf
  volumes:
    - ./logstash/config:/etc/logstash/conf.d
  ports:
    - "5000:5000"
    - "12202:12201/udp" #mapping mosquitto logs
    - "12203:12201/udp" #mapping redis logs

Эта конфигурация и добавление записи gelf {} в logstash.conf чтобы он заработал, важно также правильно настроить IP-адрес службы докеров.

С уважением!

В Docker compose есть ключевое слово logging: источник

logging: 
  driver: syslog
  options: 
    syslog-address: "tcp://192.168.0.42:123"

Так что, если вы знаете, куда двигаться дальше, дерзайте.

Если нет, я могу посоветовать вам изучить gelf драйвер логирования для докера и плагин ввода logstash gelf

Если бы вы, например, использовали этот базовая настройка ELK-stack-in-container, вы должны обновить файл docker-compose и добавить порт - "12201:12201/udp" в логсташ.

Отредактируйте logstash.conf раздел ввода в:

input {
    tcp {
        port => 5000
    }
    gelf {
    }

}

Затем настройте свои контейнеры для использования драйвера ведения журнала. gelf (не системный журнал) и вариант gelf-address=udp://ip_of_logstash:12201 (вместо syslog-адреса).

Единственная магия, о которой вам нужно будет позаботиться, - это то, как Docker найдет IP-адрес или имя хоста контейнера Logstash. Вы можете решить это с помощью именования docker-compose, ссылок Docker или просто вручную.

Docker и ELK - мощные, гибкие, но, следовательно, большие и сложные звери. Приготовьтесь серьезно посвятить время чтению и экспериментам.

Не бойтесь задавать новые (и желательно очень конкретные) вопросы, с которыми вы столкнетесь при изучении всего этого.