Зачем использовать ELK для сбора логов
В настоящее время большинство проектов используют микросервисную архитектуру.На ранней стадии проекта, чтобы выйти в онлайн, как планировалось, не было построено платформы для сбора и анализа журналов. Поскольку количество сервисов в проекте увеличивается, каждый сервис развертывается в кластерах, а количество серверов быстро увеличивается, в это время выявляется множество проблем:
- Устранение неполадок затруднено.Чтобы запросить журналы службы, вам необходимо войти на несколько серверов;
- Трудно объединить журналы.В процессе несколько узлов, и объединение журналов всего процесса требует много работы;
- Управление эксплуатацией и обслуживанием затруднено.Не каждый коллега имеет право войти на сервер для просмотра журнала, но если вам нужно устранить проблему на основе журнала, вам нужен коллега с разрешением на загрузку журнала и предоставление его соответствующему ответственному коллеге.
- Системе трудно дать раннее предупреждение и невозможно своевременно уведомить соответствующее ответственное лицо, когда обслуживание ненормально.
Позже loghub в Ant Financial Cloud был адаптирован для унифицированного сбора и хранения журналов. Поскольку loghub не является открытым исходным кодом, конкретная реализация loghub не очень ясна. Однако в отрасли обычно используется ELK (elasticsearch+logstash+kibana) для сбора логов.Фактически принцип аналогичен loghub.Ниже приводится объяснение интеграции ELK с SpringBoot.
Введение в ELK
ELK — это аббревиатура трех программ с открытым исходным кодом соответственно: elasticsearch, logstash, kibana.
- Elasticsearch — это распределенная поисковая система с открытым исходным кодом, которая предоставляет три функции сбора, анализа и хранения данных. Его функции: распределенная, нулевая конфигурация, автоматическое обнаружение, автоматическое сегментирование индекса, механизм репликации индекса, интерфейс в спокойном стиле, несколько источников данных, автоматическая поисковая загрузка и т. д.
- Logstash — это в основном инструмент для сбора, анализа и фильтрации журналов, который поддерживает большое количество методов сбора данных. Общий режим работы — архитектура c/s.Клиентская часть устанавливается на хост, которому нужно собирать логи.Серверная сторона отвечает за фильтрацию и модификацию полученных логов каждой ноды и отправку их в elasticsearch.
- Kibana может визуально отображать веб-интерфейс для Logstash и ElasticSearch с помощью отчетов и графических данных, которые могут помочь в обобщении, анализе и поиске важных журналов данных.
Схемы реализации сбора логов
Разверните logstash на каждом узле, соберите соответствующие журналы и отправьте их в elasticsearch для хранения после анализа и фильтрации.Elasticsearch сжимает и сохраняет данные в виде осколков и отображает журналы графически через kibana.Вариант 1: logstash->elasticsearch->kibana
Преимущества: эта архитектура проста в построении и удобна в использовании.
недостаток:
- 1. Logstash развернут на каждом узле, который занимает процессор и имеет большой объем памяти во время выполнения, что будет иметь определенное влияние на производительность узла.
- 2. Данные журнала не кешируются, есть риск потери
Агент logstash отслеживает и фильтрует журналы и отправляет отфильтрованное содержимое журналов в Kafka.Сервер logstash собирает журналы и отправляет их в elasticsearch, а также вводит механизм очереди сообщений в качестве пула буферов.Даже если сервер logstash неисправен, журналы временно хранятся в очереди сообщений Kafka. Избегайте потери данных журнала, но все равно не решаете проблему с производительностью.Вариант 2: logstash->kafka->elasticsearch->kibana
На этот раз выбирается первое решение, а второе решение будет реализовано позже.
Используйте docker compose для создания среды ELK
Вам необходимо заранее загрузить образ докера. Elasticsearch, logstash и kibana — все версии 6.4.0. Лучшая версия должна быть такой же.
docker pull elasticsearch:6.4.0
docker pull logstash:6.4.0
docker pull kibana:6.4.0
Создайте каталог для локального хранения файлов
Создайте каталог elasticsearch и logstash, которые впоследствии будут использоваться для хранения файлов конфигурации.
Создайте новый файл конфигурации logstash logstash.conf и загрузите его в каталог logstash.
Содержимое logstash.conf:input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "springboot-%{+YYYY.MM.dd}"
}
}
Запустите службу ELK с помощью скрипта docker-compose.yml.
Содержимое docker-compose.yml:
version: '3'
services:
elasticsearch:
image: elasticsearch:6.4.0
container_name: elasticsearch
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
volumes:
- /Users/storage/software/docker/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
- /Users/storage/software/docker/elk/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
ports:
- 9200:9200
- 9300:9300
kibana:
image: kibana:6.4.0
container_name: kibana
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
environment:
- "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
ports:
- 5601:5601
logstash:
image: logstash:6.4.0
container_name: logstash
volumes:
- /Users/storage/software/docker/elk/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
depends_on:
- elasticsearch #kibana在elasticsearch启动之后再启动
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
ports:
- 4560:4560
Выполните команду docker-compose в каталоге файла для запуска.
docker-compose up -d
Время запуска может быть немного большим, вам нужно набраться терпения
Установите плагин json_lines в logstash.
# 进入logstash容器(e9c845c8d48e为容器id)
docker exec -it e9c845c8d48e /bin/bash
# 进入bin目录
cd /bin/
# 安装插件
logstash-plugin install logstash-codec-json_lines
# 退出容器
exit
# 重启logstash服务
docker restart logstash
адрес:http://127.0.0.1:9200/
адрес:http://127.0.0.1:5601
Выше приведен интерфейс для успешного запуска elasticsearch и kibana.
Springboot интегрирует logstash
Добавьте зависимость logstash-logback-encoder в pom.xml.
<!--集成logstash-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
Добавьте файл конфигурации logback-spring.xml для вывода журналов журналов в logstash.
<!--输出到logstash的appender-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!--可以访问的logstash日志收集端口-->
<destination>127.0.0.1:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<springProfile name="dev">
<root>
<level value="INFO"/>
<appender-ref ref="stdout"/>
<appender-ref ref="asyncInfo"/>
<appender-ref ref="asyncWarn"/>
<appender-ref ref="asyncError"/>
<appender-ref ref="LOGSTASH"/>
</root>
</springProfile>
<springProfile name="test,prod">
<root>
<level value="INFO"/>
<appender-ref ref="asyncInfo"/>
<appender-ref ref="asyncWarn"/>
<appender-ref ref="asyncError"/>
<appender-ref ref="LOGSTASH"/>
</root>
</springProfile>
Просмотр информации журнала в кибане
Создать шаблон индекса
Просмотр собранных журналов
Запустите наш проект, и вы увидите, что журнал запуска был выведен в elasticsearch.
Суммировать
После создания системы журналов ELK мы можем напрямую просматривать системный журнал на kibana, а также выполнять поиск.