Как бы вы организовали логирование только для определённых приложений с использованием стека EFK?
Ответ от нейросети
sobes.tech AI
Для логирования определённых приложений в стеке EFK (Elasticsearch, Fluentd, Kibana) я бы использовал следующие шаги:
-
Настройка 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> -
Конфигурация Elasticsearch. Elasticsearch автоматически создаст индексы с префиксом
myapps-*(или тем, что указан вlogstash_prefix) на основе данных, поступающих от Fluentd. Никаких специальных настроек для фильтрации данных приложений на стороне Elasticsearch не требуется, Elasticsearch просто хранит поступающие данные по индексам. -
Настройка 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.*' - На вкладке "Discover" можно фильтровать данные по полю
Таким образом, ключом к организации логирования только для определенных приложений является:
- Использование специфичных путей к файлам логов в
sourceсекциях Fluentd. - Назначение уникальных тегов (
tag) для логов каждого приложения в Fluentd. - Использование этих тегов (или полей, добавленных на основе тегов) для фильтрации в Kibana.
- Ограничение отправки данных в Elasticsearch только для нужных тегов с помощью секции
match.