SpringBoot интегрирует ELK для сбора журналов

Elasticsearch

Зачем использовать 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 с помощью отчетов и графических данных, которые могут помочь в обобщении, анализе и поиске важных журналов данных.

Схемы реализации сбора логов

Вариант 1: logstash->elasticsearch->kibana

Разверните logstash на каждом узле, соберите соответствующие журналы и отправьте их в elasticsearch для хранения после анализа и фильтрации.Elasticsearch сжимает и сохраняет данные в виде осколков и отображает журналы графически через kibana.

Преимущества: эта архитектура проста в построении и удобна в использовании.

недостаток:

  • 1. Logstash развернут на каждом узле, который занимает процессор и имеет большой объем памяти во время выполнения, что будет иметь определенное влияние на производительность узла.
  • 2. Данные журнала не кешируются, есть риск потери

Вариант 2: logstash->kafka->elasticsearch->kibana

Агент logstash отслеживает и фильтрует журналы и отправляет отфильтрованное содержимое журналов в Kafka.Сервер logstash собирает журналы и отправляет их в elasticsearch, а также вводит механизм очереди сообщений в качестве пула буферов.Даже если сервер logstash неисправен, журналы временно хранятся в очереди сообщений Kafka. Избегайте потери данных журнала, но все равно не решаете проблему с производительностью.

На этот раз выбирается первое решение, а второе решение будет реализовано позже.

Используйте 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, а также выполнять поиск.