Решение для анализа логов ELK

Redis задняя часть Kibana Elasticsearch

Для микросервисов проектов компании с увеличением количества проектов и серверов было принято решение использовать платформу анализа логов ELK (Elasticsearch+Logstash+Kibana) для анализа логов микросервисов.

1. Общий план ЭЛК

1.1 Схема архитектуры ELK

1.2 Рабочий процесс ЭЛК

1. Разверните logStash на сервере микросервиса в качестве роли ОТПРАВИТЕЛЬ, сбор данных из файла журнала микрокаталога, вывод собранных данных в очередь сообщений Redis.

2. Logstash развернут на другом сервере, роль Indexer по мере чтения данных из очереди сообщений Redis (может обрабатывать данные) выводится на мастер-ноду Elasticsearch-Master.

3. Первичный узел Elasticsearch-Master синхронизирует данные с вторичным узлом. (Кластер Elasticsearch рекомендует нечетное количество сервисов, превышающее 3)

4. Kibana развертывает сервер, считывает данные кластера Elasticsearch, отображает страницу веб-запроса и обеспечивает отображение данных.

2. Выбор очереди сообщений

2.1 Redis

В моем окончательном плане я решил использовать Redis в качестве очереди сообщений для буферизации, снижения нагрузки на Elasticsearch и участия в снижении пиковых нагрузок.Основная причина в том, что компания учитывает вопросы затрат, а сбор журналов используется только для наших единая проектная группа, поэтому я выбрал кластер Redis, который уже есть у компании, и теперь используется повторно.

2.2 Kafka

В изначальном плане Kafka была выбрана для очереди сообщений.Ведь Kafka родилась как очередь сообщений.В конце концов, я не буду здесь много говорить об этих двух.

3. Установка

Здесь писать не буду, а три адреса приведены только для ознакомления:

Linux установить Logstash
Установка Linux Кибана
Установите Elasticsearch в Linux.

4. Конфигурация логсташа

4.1 log2redis

читать из файла журнала в Redis

#从日志文件读取数据
#file{}
#type 日志类型
#path 日志位置
#            可以直接读取文件(a.log)
#            可以所有后缀为log的日志(*.log)
#            读取文件夹下所有文件(路径)
#start_position 文件读取开始位置 (beginning)
#sincedb_path 从什么位置读取(设置为/dev/null自动从开始位置读取)
input {
     file {
        type => "log"
        path => ["/root/logs/info.log"]
        start_position => "beginning"
        sincedb_path => "/dev/null"
     }
}
#根据时间戳分隔日志
#grok 区分日志中得字段
filter {
     multiline {
       pattern => "^%{TIMESTAMP_ISO8601} "
       negate => true
       what => previous
     }
     #定义数据的格式
     grok {
       match => { "message" => "%{DATA:datetime} - %{DATA:logLevel} - %{DATA:serviceName} - %{DATA:ip} - %{DATA:pid} - %{DATA:thread} - %{DATA-msg}"}
     }
}
#输出数据到Redis
#host Redis主机地址
#port Redis端口
#db Redis数据库编号
#data_type Redis数据类型
#key Redis的key
#password Redis密码
output {
    redis {
        host => "ip"
        port => "6379"
        db => "6"
        data_type => "list"
        password => "password"
        key => "test_log"
    }
}

4.2 redis2es

читать из redis в es

#从redis内读取数据
#host Redis主机ip
#port Redis端口
#data_type Redis数据类型
#batch_count
#password Redis密码
#key Redis读取Key
input {
    redis {
        host => "ip"
        port => "6379"
        db => "6"
        data_type => "list"
        password => "password"
        key => "test_log"
    }
}
#数据的输出我们指向了es集群
#hosts Elasticsearch主机地址
#index Elasticsearch索引名称
output {
  elasticsearch {
        hosts => "ip:9200"
        index => "logs-%{+YYYY.MM.dd}"
  }
}

5 других

Остальные это кластер Es и Kibana.Эти два особо не примечательны.Просто поищите в интернете и найдёте много статей.

Вышеизложенное представляет собой только мой план использования проекта, который может не подходить для всех сценариев и предназначен только для справки.