Сбор логов кластера Elasticsearch и audit logging из контейнеров

Добрый день! Кластер Elasticsearch запущен из docker-compose. Посоветуйте, возможно ли собирать логи кластера и логи audit logging из контейнеров с помощью Filebeat? Или стоит пробрасывать логи наружу и собирать традиционным способом?

У меня немного похожая конфигурация.
Только логи собираю не с кластера ElasticSearch, а с контейнеров web-apps (часть контейнеров - apache, часть - nginx).

Вот так запущен filebeat на каждом хосте:

version: '3.4'

services:
  webserver:
    image: docker.elastic.co/beats/filebeat:7.10.0
    container_name: filebeat 
    volumes:
      - /etc/filebeat/filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
      - /var/lib/docker/containers:/var/lib/docker/containers:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - /var/lib/filebeat:/usr/share/filebeat/data:rw
    restart: unless-stopped
    user: root
    command: filebeat -e -strict.perms=false
    network_mode: bridge

/var/lib/filebeat:/usr/share/filebeat/data - это чтобы не терялись файлы registry

А вот такой конфиг filebeat.yml:


filebeat.autodiscover:
  providers:
  - type: docker
    templates:
      - condition:
          contains:
            docker.container.name: "nginx-"
        config:
          - module: nginx
            access:
              input:
                type: container
                paths:
                  - /var/lib/docker/containers/${data.docker.container.id}/*.log
                stream: stdout
                fields.host.name: ub20azure
                fields_under_root: true
            error:
              input:
                type: container
                paths:
                  - /var/lib/docker/containers/${data.docker.container.id}/*.log
                stream: stderr
                fields.host.name: ub20azure
                fields_under_root: true

      - condition:
          contains:
            docker.container.name: "apache-"
        config:
          - module: apache
            access:
              input:
                type: container
                paths:
                  - /var/lib/docker/containers/${data.docker.container.id}/*.log
                stream: stdout
                fields.host.name: ub20azure
                fields_under_root: true
            error:
              input:
                type: container
                paths:
                  - /var/lib/docker/containers/${data.docker.container.id}/*.log
                stream: stderr
                fields.host.name: ub20azure
                fields_under_root: true

      - condition:
          equals:
            docker.container.name: "nginx-proxy"
        config:
          - type: container
            include_lines: ['.*\[error\].*']
            exclude_lines:  ['.*xmlrpc.php.*']
            paths:
              - /var/lib/docker/containers/${data.docker.container.id}/*.log
            fields.host.name: ub20azure
            fields_under_root: true

#============================= Elastic Cloud ==================================
cloud.id: ******
cloud.auth: ******

#================================ Processors =====================================

# Configure processors to enhance or manipulate events generated by the beat.

processors:
  - add_locale: ~

host.name приходится устанавливать "вручную" в конфиге, потому что без этой строчки, host.name будет некое эфемерное ID докер-контейнера, которое будет изменяться каждый при пересоздании контейнера. Поэтому:
fields.host.name: ub20azure

1 Like

Сегодня наткнулся подсказку в Github:

Если контейнер с filebeat запускать с network_mode: host (или --net=host в коммандной строке),
то host.name будет приходить с хостовой системы, и тогда fields.host.name и fields_under_root не нужны.

1 Like