Серверное оборудование для бизнеса — надёжные решения для любых задач Подробнее →
Статья

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, не требует сложной настройки и отлично масштабируется горизонтально при необходимости.

3 Ответа

  1. Мигрировали с ELK на Loki полгода назад — потребление оперативки упало с 24 ГБ до 3 ГБ на том же объёме логов. Единственный минус это отсутствие нормального полнотекстового поиска, но для большинства задач хватает.

  1. Советую сразу разобраться с pipeline_stages в Promtail — правильный парсинг логов на этапе сбора сильно ускоряет последующие запросы. Без этого LogQL начинает работать заметно медленнее на больших объёмах.

  1. Хорошая статья для старта, но стоит упомянуть что в продакшене лучше использовать S3-совместимое хранилище для chunks — локальный диск при больших объёмах быстро заканчивается.