ELK Stack: сбор и анализ логов
Компоненты ELK
ELK Stack состоит из четырех компонентов: Elasticsearch (хранилище и поиск), Logstash (сбор и обработка), Kibana (визуализация) и Beats (легкие агенты сбора). Вместе они образуют полноценную платформу для централизованного сбора и анализа логов.
Docker Compose развертывание
# docker-compose.yml
version: '3.8'
services:
elasticsearch:
image: docker.elastic.co/elasticsearch/elasticsearch:8.13.0
environment:
- discovery.type=single-node
- xpack.security.enabled=false
- "ES_JAVA_OPTS=-Xms1g -Xmx1g"
volumes:
- es-data:/usr/share/elasticsearch/data
ports:
- 9200:9200
logstash:
image: docker.elastic.co/logstash/logstash:8.13.0
volumes:
- ./logstash/pipeline:/usr/share/logstash/pipeline
ports:
- 5044:5044
depends_on:
- elasticsearch
kibana:
image: docker.elastic.co/kibana/kibana:8.13.0
ports:
- 5601:5601
environment:
- ELASTICSEARCH_HOSTS=http://elasticsearch:9200
depends_on:
- elasticsearch
filebeat:
image: docker.elastic.co/beats/filebeat:8.13.0
user: root
volumes:
- /var/log:/var/log:ro
- ./filebeat.yml:/usr/share/filebeat/filebeat.yml:ro
volumes:
es-data:
Logstash pipeline
# logstash/pipeline/nginx.conf
input {
beats {
port => 5044
}
}
filter {
if [fields][log_type] == "nginx" {
grok {
match => {
"message" => '%{IPORHOST:remote_ip} - %{DATA:user} \[%{HTTPDATE:timestamp}\] "%{WORD:method} %{DATA:request} HTTP/%{NUMBER:http_version}" %{NUMBER:status} %{NUMBER:bytes} "%{DATA:referrer}" "%{DATA:agent}"'
}
}
date {
match => ["timestamp", "dd/MMM/yyyy:HH:mm:ss Z"]
target => "@timestamp"
}
geoip {
source => "remote_ip"
}
useragent {
source => "agent"
target => "user_agent"
}
mutate {
convert => {
"status" => "integer"
"bytes" => "integer"
}
}
}
}
output {
elasticsearch {
hosts => ["http://elasticsearch:9200"]
index => "nginx-%{+YYYY.MM.dd}"
}
}
Filebeat конфигурация
# filebeat.yml
filebeat.inputs:
- type: log
enabled: true
paths:
- /var/log/nginx/access.log
fields:
log_type: nginx
fields_under_root: true
- type: log
enabled: true
paths:
- /var/log/syslog
fields:
log_type: syslog
fields_under_root: true
output.logstash:
hosts: ["logstash:5044"]
Filebeat потребляет всего 10-20 МБ памяти и отправляет логи батчами, что делает его идеальным для серверов с ограниченными ресурсами.
Запросы к Elasticsearch
# Поиск ошибок за последние 24 часа
curl -X GET "localhost:9200/nginx-*/_search" -H 'Content-Type: application/json' -d'
{
"query": {
"bool": {
"must": [
{ "match": { "status": 500 } },
{ "range": { "@timestamp": { "gte": "now-24h" } } }
]
}
},
"size": 50,
"sort": [{ "@timestamp": { "order": "desc" } }]
}'
# Агрегация: топ-10 IP по количеству запросов
curl -X GET "localhost:9200/nginx-*/_search" -H 'Content-Type: application/json' -d'
{
"size": 0,
"aggs": {
"top_ips": {
"terms": { "field": "remote_ip.keyword", "size": 10 }
}
}
}'
Индексация и.lifecycle management
<# Шаблон индекса для автоматического lifecycle management
curl -X PUT "localhost:9200/_index_template/nginx" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["nginx-*"],
"template": {
"settings": {
"number_of_shards": 2,
"number_of_replicas": 1,
"index.lifecycle.name": "nginx-policy",
"index.lifecycle.rollover_alias": "nginx"
}
}
}'
# Политика: горячие данные 7 дней, warm 30 дней, удаление через 90 дней
curl -X PUT "localhost:9200/_ilm/policy/nginx-policy" -H 'Content-Type: application/json' -d'
{
"policy": {
"phases": {
"hot": {
"actions": {
"rollover": { "max_size": "10gb", "max_age": "7d" }
}
},
"warm": {
"min_age": "7d",
"actions": {
"shrink": { "number_of_shards": 1 },
"forcemerge": { "max_num_segments": 1 }
}
},
"delete": {
"min_age": "90d",
"actions": { "delete": {} }
}
}
}
}'
Kibana дашборды
После настройки индексов в Kibana можно создать дашборды с метриками: количество запросов в секунду, распределение по статус-кодам, топ эндпоинтов, география запросов. Kibana поддерживает Lens для drag-and-drop визуализаций и Dashboard для сборки полных обзоров.
Производительность
- Разделяйте горячие и холодные данные через ILM
- Используйте shard routing по приложению для изоляции
- Настройте.refresh_interval на 30s для индексов с высокой записью
- Мониторьте размер кластера через
_cluster/health
Вывод
ELK Stack — это мощная платформа для централизованного сбора логов. Начните с минимального развертывания через Docker Compose, настройте Filebeat для сбора логов, Logstash для обработки и Kibana для визуализации. Масштабируйте кластер по мере роста объемов данных.