Проблема
Логи серверов главный источник информации при диагностике сбоев, расследовании инцидентов и аудите. Пока серверов один или два, администратор может зайти по 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.
- Скачайте актуальную версию 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
- Создайте конфигурационный файл
/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.
- Создайте 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
- Запустите 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
- Зайдите в веб-интерфейс Grafana (
http://<IP>:3000, логин/пароль по умолчаниюadmin/admin). - Перейдите в Connections → Data sources → Add data source.
- Выберите Loki.
- В поле URL укажите
http://<IP_LOKI>:3100. - Нажмите Save & test. Должна появиться зелёная галочка «Data source connected and labels found».
Шаг 4. Поиск логов и создание дашборда
- В боковом меню Grafana выберите Explore, в качестве источника выберите Loki.
- В поле Log browser введите запрос
{job="syslog"}и нажмите Run query. Вы увидите логи syslog со всех серверов, где запущен Promtail. - Для фильтрации по конкретному хосту:
{job="syslog", host="web01"}. - Чтобы найти ошибки nginx:
{job="nginx", type="error"} |= "500". - На вкладке Logs можно переключаться между текстовым представлением и гистограммой по времени.
- Для сохранения поискового запроса как дашборда нажмите 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-journal: sudo usermod -aG systemd-journal promtail и перезапустите Promtail. |
Стек Loki + Promtail + Grafana закрывает задачу централизованного сбора и анализа логов без необходимости развёртывать громоздкий Elasticsearch. Легковесные агенты на клиентах, простое хранение и быстрый поиск через привычный интерфейс Grafana делают это решение идеальным для администраторов, которые хотят быстро найти ошибку в логах, а не настраивать Java-кучи. Единожды развернув такую инфраструктуру, вы получаете полную прозрачность происходящего на серверах и сможете расследовать инциденты за минуты, а не часы.







