Для микросервисов проектов компании с увеличением количества проектов и серверов было принято решение использовать платформу анализа логов 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.Эти два особо не примечательны.Просто поищите в интернете и найдёте много статей.
Вышеизложенное представляет собой только мой план использования проекта, который может не подходить для всех сценариев и предназначен только для справки.