Grafana Loki: логирование без Elasticsearch
Grafana Loki: логирование без Elasticsearch
Elasticsearch — мощный инструмент, но его аппетиты к RAM и дисковому пространству умеют удивлять даже опытных администраторов. Grafana Loki предлагает принципиально иной подход: вместо полноценной индексации содержимого логов он индексирует только метки (labels), а сами строки хранит в сжатом виде. Результат — на порядок меньшее потребление ресурсов при вполне приемлемой функциональности для большинства сценариев.
Архитектура Loki
Loki состоит из нескольких компонентов:
- Distributor — принимает входящие потоки логов
- Ingester — буферизует данные в памяти перед записью
- Querier — выполняет запросы к хранилищу
- Compactor — сжимает и дедуплицирует индексы
В небольших инсталляциях всё это запускается в одном процессе (-target=all), что значительно упрощает эксплуатацию.
Установка через Docker Compose
Самый быстрый способ запустить полный стек (Loki + Promtail + Grafana):
mkdir loki-stack && cd loki-stack
cat > docker-compose.yml << 'EOF'
version: "3"
services:
loki:
image: grafana/loki:2.9.0
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
volumes:
- loki-data:/loki
promtail:
image: grafana/promtail:2.9.0
volumes:
- /var/log:/var/log:ro
- ./promtail-config.yml:/etc/promtail/config.yml
command: -config.file=/etc/promtail/config.yml
grafana:
image: grafana/grafana:10.2.0
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=secret
volumes:
loki-data:
EOF
docker compose up -d
Настройка Promtail
Promtail — агент сбора логов, аналог Filebeat. Конфиг promtail-config.yml:
server:
http_listen_port: 9080
positions:
filename: /tmp/positions.yaml
clients:
- url: http://loki:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
host: my-server
__path__: /var/log/*.log
- job_name: nginx
static_configs:
- targets:
- localhost
labels:
job: nginx
host: my-server
__path__: /var/log/nginx/*.log
pipeline_stages:
- regex:
expression: '^(?P<ip>S+) S+ S+ [.*?] "(?P<method>S+) (?P<path>S+).*?" (?P<status>d+)'
- labels:
method:
status:
LogQL: язык запросов
LogQL — SQL-подобный язык для работы с логами в Loki. Основные операции:
Фильтрация по метке и тексту:
{job="nginx"} |= "ERROR"
Подсчёт ошибок за последний час:
sum(count_over_time({job="nginx"} |= "ERROR" [1h]))
Топ IP-адресов по количеству запросов:
topk(10, sum by (ip) (count_over_time({job="nginx"} | regex "(?P<ip>\d+\.\d+\.\d+\.\d+)" [5m])))
Сравнение с Elasticsearch
| Параметр | Loki | Elasticsearch |
|---|---|---|
| RAM на 10 GB логов | ~500 MB | ~4−8 GB |
| Полнотекстовый поиск | Нет (regex) | Да |
| Поиск по метке | Быстро | Быстро |
| Сложность эксплуатации | Низкая | Высокая |
Когда Loki не подходит
Loki не умеет делать полнотекстовый поиск по произвольным полям — только regex и фильтры по заранее известным меткам. Если вам нужен мощный парсинг структурированных логов с возможностью запросов по любому полю, Elasticsearch или OpenSearch всё ещё актуальны.
Итог
Loki — отличный выбор для команд, которым нужна простая и дешёвая система хранения логов. Он нативно интегрируется с Grafana, не требует сложной настройки и отлично масштабируется горизонтально при необходимости.
Мигрировали с ELK на Loki полгода назад — потребление оперативки упало с 24 ГБ до 3 ГБ на том же объёме логов. Единственный минус это отсутствие нормального полнотекстового поиска, но для большинства задач хватает.