Введение
Promtail + Loki + Grafana — это связка инструментов для сбора, обработки и визуализации логов. Эти 3 важных компонента работают вместе.
- Grafana – мощный инструмент для визуализации данных. Он позволяет строить графики, панели мониторинга и работать с различными источниками данных, включая Loki.
- Loki – система агрегации и хранения логов, разработанная Grafana Labs. Loki похож на Prometheus, но для логов. Он индексирует не весь текст логов, а только метаданные (лейблы), что делает его быстрым и эффективным.
- Promtail – агент для сбора логов. Он читает логи из файлов, обрабатывает их (например, добавляет метки) и отправляет в Loki.
Приложение (Пишет логи в файл) -> Promtail (Читает файлы, добавляет метки) -> Loki (Хранит логи) <- Grafana (Визуализирует полученные данные)
В Telegram я сделал более глубокий разбор функционала и архитектуры Loki, который поможет тебе хорошо разобраться как же он работает на самом деле.
Если интересно — Присоединяйся


Основная цель данной заметки:
Сделать общее хранилище и визуализацию логов, с других серверов.
Адрес моего сервера логирования 192.168.10.131
Шаг 1. Установка docker, docker-compose
1
2
3
4
5
6
7
8
9
| sudo apt update
sudo apt install -y ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo tee /etc/apt/keyrings/docker.asc > /dev/null
sudo chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
|
Проверяем установку
1
2
| docker --version
docker compose version
|
Добавляем пользователя в группу docker
1
2
| sudo usermod -aG docker $USER
newgrp docker
|
Шаг 2. Подготавливаем файлы конфига
Создаём директории:
1
2
| sudo mkdir -p /opt/logging/data_loki
sudo mkdir /opt/logging/promtail
|
Конфигурация содержит 3 сервиса: Loki, Promtail и Grafana
Создаём файл compose:
1
| sudo nano /opt/logging/docker-compose.yaml
|
Наполняем:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| services:
loki:
container_name: loki
image: grafana/loki:3.4.2
command: "-config.file=/etc/loki/config.yaml"
ports:
- "3100:3100"
volumes:
- ./data_loki/config.yaml:/etc/loki/config.yaml:ro
restart: unless-stopped
promtail:
image: grafana/promtail:3.4.2
command: "-config.file=/mnt/config/config.yaml"
volumes:
- ./promtail/config.yaml:/mnt/config/config.yaml:ro
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
grafana:
image: grafana/grafana-oss:11.5.2
container_name: grafana
ports:
- "3000:3000"
restart: unless-stopped
|
Собирать логи с контейнеров можно двумя способами:
- Первый - это установить loki docker plugin для доставки логов до Loki.
- Второй - это прописывать на устройствах сборку логов через docker сокет, как в нашем случае.
Создаём файл конфига promtail:
1
| sudo nano /opt/promtail/config.yaml
|
Наполняем:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://192.168.10.131:3100/loki/api/v1/push # Изменяйте на IP своего сервера с Promtail
scrape_configs:
# Сбор логов с Docker контейнеров
- job_name: docker-logs
docker_sd_configs:
- host: unix:///var/run/docker.sock
relabel_configs:
- source_labels: [__meta_docker_container_name]
target_label: container
- source_labels: [__meta_docker_container_log_stream]
target_label: stream
# Сбор логов из файлов (например, системные логи)
- job_name: system-logs
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*.log
|
Локи может работать как одиночный узел (Single) с локальным хранилищем (для небольших проектов), или в микросервисном (кластерном) режиме, где все его компоненты (Distributor, Ingester, Querier, Compactor, Ruler, Query Frontend)
работают как отдельные сервисы, а данные сохраняются в S3, MinIO.
1
| sudo nano opt/data_loki/config.yaml
|
Далее создаём конфиг loki.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
| auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
instance_addr: 127.0.0.1
path_prefix: /loki
storage:
filesystem:
chunks_directory: /loki/chunks
rules_directory: /loki/rules
replication_factor: 1
ring:
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-10-24
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
ruler:
alertmanager_url: http://localhost:9093
|
Описание конфигурации:
Параметр | Описание |
---|
auth_enabled: false | Выключает авторизацию |
instance_addr: 127.0.0.1 | Адрес на котором работает Loki |
http_listen_port | Порт для прослушивания локи |
path_prefix: /loki | Базовый путь, где Loki будет хранить свои файлы и данные |
storage.filesystem | Loki хранит логи на локальной файловой системе |
replication_factor: 1 | Количество реплик в системе |
ring.kvstore.store: inmemory | Loki хранит метаданные в памяти |
Шаг 3. Запускаем
1
| sudo docker-compose up -d
|
Открываем графану по IP-адресу сервера, порт 3000

Переходим на вкладку:
Connections -> Add new connection -> Loki -> URL: http://192.168.10.131:3100 -> Save and Test

Если все сделано правильно подключение активируется и графана начнёт отображать логи во вкладке Explore -> Logs

Шаг 4. Подключаем другой docker-хост
Заходим на сервер, который будет отправлять логи. Создаём директории:
1
2
3
| sudo mkdir /opt/promtail
cd /opt/promtail/
sudo nano docker-compose.yaml
|
Наполняем:
1
2
3
4
5
6
7
8
| services:
promtail:
image: grafana/promtail:3.4.2
command: "-config.file=/mnt/config/config.yaml"
volumes:
- ./config/config.yaml:/mnt/config/config.yaml:ro
- /var/run/docker.sock:/var/run/docker.sock
restart: unless-stopped
|
И создаём конфигурацию:
1
2
| sudo mkdir -p ./config/
sudo nano ./config/config.yaml
|
Подключаем сервер на отправку логов:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yaml
clients:
- url: http://192.168.10.131:3100/loki/api/v1/push # Изменяйте на IP своего сервера с Promtail
scrape_configs:
- job_name: docker-logs
docker_sd_configs:
- host: unix:///var/run/docker.sock
relabel_configs:
- source_labels: [__meta_docker_container_name]
target_label: container
- source_labels: [__meta_docker_container_log_stream]
target_label: stream
|
Запускаем:
Для примера на данном сервере запущу контейнер с nginx
1
| docker run --name nginx -p 8080:80 -d nginx
|
Идем в графану Explore - Logs
и смотрю логи

На этом базовая настройка завершена.