2026-09-16
Grafana Loki

Логи в 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

  1. Grafana → Configuration → Data Sources → Add data source → Loki.
  2. URL: http://localhost:3100.
  3. Save & Test.

Шаг 4. Поиск логов в Explore

  1. Grafana → Explore.
  2. Выберите источник Loki.
  3. В строке запроса введите 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.


Проверка

  1. curl http://localhost:3100/ready — ready.
  2. Grafana → Explore: {job="nginx"} — строки логов появились.
  3. {job="nginx"} |= "404" — фильтр.
  4. Убедитесь, что 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *