Централизованный сбор логов с помощью Loki, Promtail и Grafana

Проблема

Логи серверов главный источник информации при диагностике сбоев, расследовании инцидентов и аудите. Пока серверов один или два, администратор может зайти по SSH и просмотреть /var/log/syslog или journalctl. Но когда парк машин разрастается до десятков и сотен, ручной просмотр превращается в пытку: логи разрознены, нет единого поиска, а хранение на локальных дисках быстро заканчивается. Классический стек ELK (Elasticsearch, Logstash, Kibana) решает задачу, но крайне требователен к ресурсам: для скромного журнала в 5–10 ГБ в день Elasticsearch может потребовать 8–16 ГБ ОЗУ только под кучу Java. Администраторам небольших и средних инфраструктур нужен инструмент полегче. Promtail в связке с Loki и Grafana — именно такой стек: он написан на Go, потребляет минимум памяти, горизонтально масштабируется и при этом интегрируется с привычной экосистемой Grafana, где уже живут дашборды Prometheus.

Решение

Развернём централизованную систему сбора логов на базе трёх компонентов: Loki (хранилище и движок запросов), Promtail (агент для сбора и отправки логов) и Grafana (интерфейс для поиска и визуализации). Loki спроектирован так, чтобы индексировать только метки (labels), а сами сообщения хранить в сжатом виде в объектном хранилище или на локальном диске — это радикально снижает требования к памяти. Promtail устанавливается на каждый целевой сервер, отслеживает заданные файлы и journald, обогащает логи метками и отправляет их в Loki. Официальная документация доступна на Grafana Loki и Promtail. Мы настроим приём логов syslog и nginx, а в Grafana создадим типовой дашборд для поиска.

Пошаговая инструкция

Шаг 1. Установка Loki на центральный сервер

Выделите сервер (или виртуальную машину) под Loki. Минимальные требования — 2 ГБ ОЗУ и 20 ГБ дискового пространства для умеренного объёма логов. В качестве ОС будем использовать Debian 12.

  1. Скачайте актуальную версию Loki из официального репозитория GitHub:

bash

cd /opt
sudo wget https://github.com/grafana/loki/releases/download/v3.0.0/loki-linux-amd64.zip
sudo unzip loki-linux-amd64.zip
sudo chmod +x loki-linux-amd64
sudo mv loki-linux-amd64 /usr/local/bin/loki
  1. Создайте конфигурационный файл /etc/loki/local-config.yaml:

yaml

auth_enabled: false

server:
  http_listen_port: 3100
  grpc_listen_port: 9096

common:
  path_prefix: /var/lib/loki
  storage:
    filesystem:
      chunks_directory: /var/lib/loki/chunks
      rules_directory: /var/lib/loki/rules
  replication_factor: 1
  ring:
    instance_addr: 127.0.0.1
    kvstore:
      store: inmemory

schema_config:
  configs:
    - from: 2024-01-01
      store: tsdb
      object_store: filesystem
      schema: v13
      index:
        prefix: index_
        period: 24h

limits_config:
  max_entries_limit_per_query: 5000

В данной конфигурации Loki хранит данные на локальной файловой системе (подходит для старта; для продакшена рассмотрите S3-совместимое хранилище). Детали всех параметров расписаны в Loki Configuration.

  1. Создайте systemd-юнит /etc/systemd/system/loki.service:
[Unit]
Description=Loki log aggregation service
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/local-config.yaml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
  1. Запустите Loki и проверьте статус:

bash

sudo mkdir -p /var/lib/loki/{chunks,rules}
sudo systemctl daemon-reload
sudo systemctl enable --now loki
sudo systemctl status loki

По умолчанию Loki слушает HTTP на порту 3100. Проверьте: curl http://localhost:3100/ready должно вернуть Ready.

Шаг 2. Установка Promtail на клиентские серверы

На каждом сервере, чьи логи нужно собирать, установите Promtail. Аналогично скачайте бинарник:

bash

cd /opt
sudo wget https://github.com/grafana/loki/releases/download/v3.0.0/promtail-linux-amd64.zip
sudo unzip promtail-linux-amd64.zip
sudo chmod +x promtail-linux-amd64
sudo mv promtail-linux-amd64 /usr/local/bin/promtail

Создайте конфигурацию /etc/promtail/config.yml:

yaml

server:
  http_listen_port: 9080
  grpc_listen_port: 0

positions:
  filename: /var/lib/promtail/positions.yaml

clients:
  - url: http://<IP_LOKI>:3100/loki/api/v1/push

scrape_configs:
  - job_name: syslog
    static_configs:
      - targets:
          - localhost
        labels:
          job: syslog
          host: <HOSTNAME>
          __path__: /var/log/syslog

  - job_name: nginx_access
    static_configs:
      - targets:
          - localhost
        labels:
          job: nginx
          host: <HOSTNAME>
          type: access
          __path__: /var/log/nginx/access.log

  - job_name: nginx_error
    static_configs:
      - targets:
          - localhost
        labels:
          job: nginx
          host: <HOSTNAME>
          type: error
          __path__: /var/log/nginx/error.log

  - job_name: journald
    journal:
      labels:
        job: journald
        host: <HOSTNAME>

Замените <IP_LOKI> на адрес сервера Loki и <HOSTNAME> на имя сервера. Каждый job определяет источник логов и набор меток. Лейблы job и host ключевые, по ним потом будете искать. Подробнее о настройке scrape_configs в Promtail Configuration.

Создайте папку для позиций и systemd-юнит /etc/systemd/system/promtail.service:

[Unit]
Description=Promtail log collector
After=network.target

[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/config.yml
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

Запустите:

bash

sudo mkdir -p /var/lib/promtail
sudo systemctl daemon-reload
sudo systemctl enable --now promtail
sudo systemctl status promtail

Проверьте логи Promtail: sudo journalctl -u promtail -f. Ошибки о недоступности Loki на этом этапе допустимы, если Loki ещё не готов.

Шаг 3. Подключение Loki как источника данных в Grafana

Установите Grafana (если ещё нет):

bash

sudo apt install -y software-properties-common wget
sudo wget -q -O /usr/share/keyrings/grafana.key https://apt.grafana.com/gpg.key
echo "deb [signed-by=/usr/share/keyrings/grafana.key] https://apt.grafana.com stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install grafana -y
sudo systemctl enable --now grafana-server
  1. Зайдите в веб-интерфейс Grafana (http://<IP>:3000, логин/пароль по умолчанию admin/admin).
  2. Перейдите в Connections → Data sources → Add data source.
  3. Выберите Loki.
  4. В поле URL укажите http://<IP_LOKI>:3100.
  5. Нажмите Save & test. Должна появиться зелёная галочка «Data source connected and labels found».

Шаг 4. Поиск логов и создание дашборда

  1. В боковом меню Grafana выберите Explore, в качестве источника выберите Loki.
  2. В поле Log browser введите запрос {job="syslog"} и нажмите Run query. Вы увидите логи syslog со всех серверов, где запущен Promtail.
  3. Для фильтрации по конкретному хосту: {job="syslog", host="web01"}.
  4. Чтобы найти ошибки nginx: {job="nginx", type="error"} |= "500".
  5. На вкладке Logs можно переключаться между текстовым представлением и гистограммой по времени.
  6. Для сохранения поискового запроса как дашборда нажмите Add to dashboard и создайте новую панель. Типовой дашборд может включать гистограмму количества логов по severity, топ-10 хостов по объёму логов и таблицу последних ошибок.

Язык запросов LogQL подробно описан в LogQL Documentation.

Шаг 5. Дополнительно: приём логов от Docker-контейнеров

Если у вас есть Docker, Promtail умеет собирать логи контейнеров через драйвер docker_sd_configs. Добавьте в scrape_configs Promtail:

yaml

  - job_name: docker
    docker_sd_configs:
      - host: unix:///var/run/docker.sock
        refresh_interval: 10s
    relabel_configs:
      - source_labels: ['__meta_docker_container_name']
        regex: '/(.*)'
        target_label: 'container'

Теперь логи каждого контейнера будут автоматически получать метку container.

Устранение распространённых проблем

СимптомВероятная причинаРешение
Loki не запускается, ошибка «permission denied»Нет прав на /var/lib/lokiВыполните sudo chown -R root:root /var/lib/loki и перезапустите.
Promtail пишет в лог «connection refused» к LokiНеправильный IP/порт или firewallПроверьте curl http://<IP_LOKI>:3100/ready с клиента. Откройте порт 3100 в брандмауэре сервера Loki.
Логи есть в Loki, но Grafana показывает «No data»Неправильный источник данных или неверный запрос LogQLПроверьте соединение в Data sources. Попробуйте запрос {job=~".+"} — он покажет все логи.
Быстро заканчивается место на дискеНет политики хранения (retention)Добавьте в limits_config Loki параметр retention_period: 168h (7 дней) и перезапустите. Подробнее в Loki Retention.
Логи journald не собираютсяPromtail собран без поддержки journald или нет прав на чтениеДобавьте пользователя root в группу systemd-journalsudo usermod -aG systemd-journal promtail и перезапустите Promtail.

Стек Loki + Promtail + Grafana закрывает задачу централизованного сбора и анализа логов без необходимости развёртывать громоздкий Elasticsearch. Легковесные агенты на клиентах, простое хранение и быстрый поиск через привычный интерфейс Grafana делают это решение идеальным для администраторов, которые хотят быстро найти ошибку в логах, а не настраивать Java-кучи. Единожды развернув такую инфраструктуру, вы получаете полную прозрачность происходящего на серверах и сможете расследовать инциденты за минуты, а не часы.

0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Популярные
Новые Старые

0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x
Menu