Логи в Grafana: Loki + Promtail вместо ELK
ELK-стек (Elasticsearch, Logstash, Kibana) — тяжелый и дорогой по памяти. Для домашних и средних проектов проще связка Grafana + Loki + Promtail: метрики и логи в одном интерфейсе, а Loki хранит логи дешевле (только индексы, сжатие). В статье — установка Loki и Promtail на Ubuntu, отправка логов приложений и nginx, поиск в Grafana Explore.
Почему Loki, а не Elasticsearch
| Свойство | ELK | Grafana + Loki |
|---|---|---|
| Память (VDS 1-2GB) | ES жрёт ≥1GB | Loki ~200-500MB |
| Индексация | Полная (дорого) | По метками-лейблам |
| Поиск | Free-text | По лейблам + grep-фильтр |
| Визуализация | Kibana | Та же Grafana, что и для метрик |
| Мультитенантность | Есть | Есть |
| Кривая обучения | Средняя | Низкая |
Если нужен полнотекстовый поиск по миллионам строк — ELK. Если «посмотреть логи сервисов и nginx в одном месте» — Loki хватает с запасом.
Архитектура
[Node1] --> Promtail --> |
[Node2] --> Promtail --> |--> Loki :3100 --> Grafana :3000 (Loki data source)
[Node3] --> Promtail --> |
- Promtail — агент: читает файлы логов, добавляет лейблы, шлёт в Loki по HTTP
- Loki — хранилище/индекс логов, отвечает на LogQL
- Grafana — Explore для просмотра и поиска
Шаг 1. Установка Loki (docker-compose)
Локи удобнее через Docker:
docker-compose.yml:
services:
loki:
image: grafana/loki:3.2
container_name: loki
restart: unless-stopped
ports:
- "3100:3100"
volumes:
- loki-data:/loki
command: -config.file=/etc/loki/local-config.yaml
volumes:
loki-data:
Для Loki 3+ файл конфигурации
local-config.yamlуже встроен в образ, либо монтируйте свой.
Запуск:
sudo docker compose up -d
Проверка готовности
curl http://localhost:3100/ready
# ready
Шаг 2. Установка Promtail
Promtail ставим на каждый сервер, откуда собираем логи.
VERSION=3.2.0
wget https://github.com/grafana/loki/releases/download/v${VERSION}/promtail-${VERSION}.linux-amd64.zip
unzip promtail-${VERSION}.linux-amd64.zip
sudo mv promtail-linux-amd64 /usr/local/bin/promtail
Конфиг Promtail
/etc/promtail/config.yml:
server:
http_listen_port: 9080
clients:
- url: http://192.168.10.55:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets: [localhost]
labels:
job: syslog
host: node1
__path__: /var/log/*.log
- job_name: nginx
static_configs:
- targets: [localhost]
labels:
job: nginx
host: node1
__path__: /var/log/nginx/*.log
systemd-юнит
/etc/systemd/system/promtail.service:
[Unit]
Description=Promtail
After=network.target
[Service]
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/config.yml
Restart=always
[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now promtail
Шаг 3. Источник данных в Grafana
- Grafana → Configuration → Data Sources → Add data source → Loki.
- URL:
http://localhost:3100. - Save & Test.
Шаг 4. Поиск логов в Explore
- Grafana → Explore.
- Выберите источник Loki.
- В строке запроса введите LogQL:
{host="node1", job="nginx"}
Быстрый поиск 500 ошибок:
{job="nginx"} |= "500"
Поиск по IP или слову:
{job="syslog"} |= "192.168.10.1"
Фильтр по времени — в правом верхнем углу (Last 15 minutes и т.д.).
Шаг 5. Логи Docker-контейнеров (статьи про Docker)
Если сервисы в Docker, собирайте их контейнерные логи. Promtail может читать json-файлы Docker:
Добавьте в config.yml:
- job_name: docker
static_configs:
- targets: [localhost]
labels:
job: docker
host: node1
__path__: /var/lib/docker/containers/*/*-json.log
pipeline_stages:
- json:
expressions:
log: log
stream: stream
Метрики не растеряем — прометеус подтянет контейнеры через cAdvisor (см. предыдущую статью).
Шаг 6. Логи Mikrotik в Loki (связка со статьями про RouterOS)
Из RouterOS логи через syslog пересылаются на сервер Loki-хоста:
/system logging action add name=loki target=remote
remote=192.168.10.55:514 remote-port=514 protocol=udp
/system logging add action=loki topics=system
/system logging add action=loki topics=interface
На Ubuntu принимающий syslog (rsyslog → файл → Promtail):
/etc/rsyslog.d/mikrotik.conf:
:fromhost-ip, isequal, "192.168.10.1" /var/log/mikrotik.log
& stop
В Promtail добавьте __path__: /var/log/mikrotik.log с лейблом job: mikrotik.
Проверка
curl http://localhost:3100/ready— ready.- Grafana → Explore:
{job="nginx"}— строки логов появились. {job="nginx"} |= "404"— фильтр.- Убедитесь, что
promtailпишет в свой журнал без ошибок:
bash
sudo journalctl -u promtail -f | tail -20
Тонкости и подводные камни
- Лейблы — это НЕ поля. В Loki каждая комбинация лейблов — отдельный таймс-серии. Не создавайте лейбл
ip— плодите тысячи потоков. IP/сообщение — это содержимое строки, ищите фильтром|=. - Хранение 30 дней — логи в Loki не бесконечные; retention настраивается в конфиге. Для анализа «за месяц» достаточно.
- Права на /var/log — Promtail под root/systemd видит все файлы, но если в чрут-контейнере — монтируйте volume.
- Порт 3100 открыт наружу — не надо, Loki только для Grafana (в той же сети/VPN).
- Порядок: сначала Loki, потом Promtail — иначе логи в никуда.
- Grafana + Loki + Prometheus из предыдущей статьи — один стек, две data source; в Explore можно ходить «метрика → логи з а период» (лайф-хак: в дашборде панель → inspect → open in Explore).
Шпаргалка
# Loki (docker)
docker compose up -d # порт 3100
# Promtail
wget .../promtail-3.2.0.linux-amd64.zip
sudo mv promtail-linux-amd64 /usr/local/bin/promtail
sudo systemctl enable --now promtail
# Grafana data source: Loki @ http://localhost:3100
# Explore: {job="nginx"} |= "500"
Проверено на: Ubuntu 22.04/24.04 + Loki/Promtail 3.2, Grafana 10.
Дата: Сентябрь 2026.