Sobes.tech
Middle+
99
questionbank

Как бы вы организовали логирование только для определённых приложений с использованием стека EFK?

Ответ от нейросети

sobes.tech AI

Для логирования определённых приложений в стеке EFK (Elasticsearch, Fluentd, Kibana) я бы использовал следующие шаги:

  1. Настройка Fluentd на source-серверах. На каждом сервере, где запущены целевые приложения, устанавливается и настраивается агент Fluentd (или td-agent). В конфигурации Fluentd (td-agent.conf или подобный) определяются источники (sources) и фильтры (filters) для сбора логов.

    # source - собирает логи из файлов
    <source>
      @type tail
      # Путь к логам конкретного приложения
      path /var/log/myapp/*.log
      # Формат логов (нужен для парсинга)
      pos_file /var/log/td-agent/myapp.log.pos
      tag app.myapp.log # Уникальный тег для этого приложения
      <parse>
        @type regexp
        expression /^(?<time>\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[(?<level>\w+)\] (?<message>.+)$/
        time_format %Y-%m-%d %H:%M:%S
      </parse>
    </source>
    
    # Можно добавить столько source, сколько приложений нужно логировать
    <source>
      @type tail
      path /var/log/other_app/app.log
      pos_file /var/log/td-agent/other_app.log.pos
      tag app.otherapp.log
      <parse>
        @type json # Или другой формат, в зависимости от приложения
      </parse>
    </source>
    
    # filter - обогащение или фильтрация данных (опционально)
    <filter app.*> # Применяется ко всем тегам, начинающимся с 'app.'
      @type record_transformer
      <record>
        hostname "#{Socket.gethostname}" # Добавляем имя хоста
        env "production" # Или другое окружение
      </record>
    </filter>
    
    # match - отправляет данные в Elasticsearch
    <match app.*> # Отправляем данные только приложений Elasticsearch
      @type elasticsearch
      host elasticsearch.host.name # Адрес вашего Elasticsearch
      port 9200
      logstash_format true # Совместимость с форматом Logstash
      logstash_prefix myapps # Индекс в Elasticsearch будет myapps-YYYY.MM.DD
      include_tag_key true
      tag_key @log_name # Сохраняем тег в поле @log_name для фильтрации в Kibana
      <buffer>
        @type file
        path /var/log/td-agent/buffer/elasticsearch
        chunk_limit_size 10m
        queue_limit_length 100
        flush_interval 1m
      </buffer>
    </match>
    
  2. Конфигурация Elasticsearch. Elasticsearch автоматически создаст индексы с префиксом myapps-* (или тем, что указан в logstash_prefix) на основе данных, поступающих от Fluentd. Никаких специальных настроек для фильтрации данных приложений на стороне Elasticsearch не требуется, Elasticsearch просто хранит поступающие данные по индексам.

  3. Настройка Kibana. В Kibana создается индекс-паттерн (Index Pattern) соответствующий префиксу индекса в Elasticsearch, например, myapps-*. После создания индекс-паттерна:

    • На вкладке "Discover" можно фильтровать данные по полю @log_name (если оно было добавлено в конфигурации Fluentd) или по другим полям, которые идентифицируют приложение (например, hostname, если приложение уникально на хосте, или добавить поле app_name через record_transformer).
    • Для создания дашбордов и визуализаций можно использовать KQL или Lucene синтаксис для фильтрации данных по тем же полям.

    Примеры фильтров в Kibana:

    @log_name : "app.myapp.log"  // Показывает только логи приложения myapp
    @log_name : "app.*" AND level : "ERROR" // Ошибки всех приложений, логируемых через 'app.*'
    

Таким образом, ключом к организации логирования только для определенных приложений является:

  • Использование специфичных путей к файлам логов в source секциях Fluentd.
  • Назначение уникальных тегов (tag) для логов каждого приложения в Fluentd.
  • Использование этих тегов (или полей, добавленных на основе тегов) для фильтрации в Kibana.
  • Ограничение отправки данных в Elasticsearch только для нужных тегов с помощью секции match.