Docker: отправка файлов журнала, записываемых внутри контейнеров, в стек ELK - PullRequest
1 голос
/ 24 октября 2019

Я запускаю приложение django, использующее docker и использующее python вход в настройки django для записи журналов API в папке журналов. Когда я перезапускаю свой контейнер, мои файлы журналов также удаляются (что понятно).

Я бы хотел отправить свои журналы (например, /path/to/workdir/logs/django.log) на elasticsearch. Я в замешательстве, так как мои поиски говорят мне, чтобы я отправил этот путь /var/lib/docker/containers/*/*.log, но я не думаю, что это то, чего я хочу.

Есть какие-нибудь идеи о том, как я отправляю свои журналы внутри контейнера в стек ELK?

1 Ответ

1 голос
/ 25 октября 2019

Вы можете отправлять журналы из docker контейнеров stdout / stderr до elasticsearch, используя драйвер ведения журнала gelf.

Сконфигурируйте службы с помощью gelf драйвер ведения журнала (docker-compose.yml):

version: '3.7'
x-logging:
  &logstash
  options:
    gelf-address: "udp://localhost:12201"
  driver: gelf
services:
  nginx:
    image: 'nginx:1.17.3'
    hostname: 'nginx'
    domainname: 'example.com'
    depends_on:
    - 'logstash'
    ports:
    - '80:80'
    volumes:
    - '${PWD}/nginx/nginx.conf:/etc/nginx/nginx.conf:ro'
    logging: *logstash
  elasticsearch:
    image: 'elasticsearch:7.1.1'
    environment:
    - 'discovery.type=single-node'
    volumes:
    - 'elasticsearch:/usr/share/elasticsearch/data'
    expose:
    - '9200'
    - '9300'
  kibana:
    image: 'kibana:7.1.1'
    depends_on:
    - 'elasticsearch'
    ports:
    - '5601:5601'
    volumes:
    - '${PWD}/kibana/kibana.yml:/usr/share/kibana/config/kibana.yml'
  logstash:
    build: 'logstash'
    depends_on:
    - 'elasticsearch'
    volumes:
    - 'logstash:/usr/share/logstash/data'
    ports:
    - '12201:12201/udp'
    - '10514:10514/udp'
volumes:
  elasticsearch:
  logstash:

Примечание : приведенный выше пример настраивает ведение журнала с использованием полей расширения .

. минимальный nginx.conf, используемый в этом примере:

user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log debug;

pid /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
  server {
    listen 80;
    server_name _;

    location / {
      return 200 'OK';
    }
  }
}

logstash - это пользовательская сборка с использованием приведенного ниже Dockerfile:

FROM logstash:7.1.1

USER 0
COPY pipeline/gelf.cfg /usr/share/logstash/pipeline
COPY pipeline/pipelines.yml /usr/share/logstash/config
COPY settings/logstash.yml /usr/share/logstash/config
COPY patterns /usr/share/logstash/patterns

RUN rm /usr/share/logstash/pipeline/logstash.conf
RUN chown -R 1000:0 /usr/share/logstash/pipeline /usr/share/logstash/patterns /usr/share/logstash/config
USER 1000

. .. соответствующий logstash gelf плагин config:

input {
  gelf {
    type => docker
    port => 12201
  }
}

filter { }

output {
  if [type] == "docker" {
    elasticsearch { hosts => ["elasticsearch:9200"] }
    stdout { codec => rubydebug }
  }
}

... и pipelines.yml:

- pipeline.id: "gelf"
  path.config: "/usr/share/logstash/pipeline/gelf.cfg"

Процесс, запущенный вЖурналы контейнеров stdout / stderr, docker переводят журналы в logstash с помощью драйвера ведения журнала gelf ( note : адрес logstash равен localhost, поскольку docker Обнаружение службы недоступно для разрешения имени службы - порты должны быть сопоставлены с хостом, а драйвер ведения журнала должен быть настроен с использованием localhost), который выводит журналы в elasticsearch, которые можно индексировать в kibana:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...