Привет! Сегодня поговорим о том, как собирать логи с серверов и приложений, не утонув в гигабайтах текста и не сжигая деньги на индексацию всего подряд. Рассмотрим современное open-source решение — Grafana Loki.
Логи — это "чёрный ящик" твоей системы. Без них:
Раньше все ставили ELK (Elasticsearch + Logstash + Kibana). Но Elasticsearch жрёт память, индексирует всё подряд и быстро становится дорогим. Loki же — лёгкий, дешёвый и отлично дружит с Grafana.
Loki — это система сбора логов от создателей Prometheus. Основные идеи:
Это значит: меньше ресурсов, проще масштабировать, дешевле хранить. Идеально для хобби-проектов, малого бизнеса и даже продакшена.
Loki сам по себе не "ищет" проблемы — он хранит и отдаёт логи по запросу. Но ты можешь:
error, timeout, 500 и т.д.Таким образом, Loki + Grafana = мощный, но простой инструмент для мониторинга состояния системы.
Предположим, у тебя уже стоит Docker и Docker Compose. Если нет — поставь их, это быстро.
Создай папку, например /opt/loki, и внутри файл docker-compose.yml:
version: '3'
services:
loki:
image: grafana/loki:latest
ports:
- "3100:3100"
command: -config.file=/etc/loki/local-config.yaml
promtail:
image: grafana/promtail:latest
volumes:
- /var/log:/var/log:ro
- /opt/loki/promtail-config.yml:/etc/promtail/config.yml:ro
command: -config.file=/etc/promtail/config.yml
grafana:
image: grafana/grafana:latest
ports:
- "3000:3000"
volumes:
- grafana_data:/var/lib/grafana
environment:
- GF_SECURITY_ADMIN_PASSWORD=admin
volumes:
grafana_
Теперь создай файл конфигурации для Promtail — /opt/loki/promtail-config.yml:
server:
http_listen_port: 9080
grpc_listen_port: 0
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
__path__: /var/log/*.log
Запускай:
cd /opt/loki
docker-compose up -d
Через минуту:
/var/log/*.log и отправлять их в Loki.http://твой_сервер:3000 (логин admin, пароль admin).Если ты, как и я, не хочешь тащить Docker ради одного сервиса — отлично! Loki прекрасно работает как обычное приложение под systemd. Разберём установку на Ubuntu/Debian (но подойдёт и для CentOS/Rocky с минимальными правками).
Заходим на официальную страницу релизов: github.com/grafana/loki/releases. Берём последние версии для Linux AMD64.
# Устанавливаем зависимости
sudo apt update
sudo apt install -y wget unzip
# Скачиваем Loki
wget https://github.com/grafana/loki/releases/latest/download/loki-linux-amd64.zip
unzip loki-linux-amd64.zip
sudo mv loki-linux-amd64 /usr/local/bin/loki
sudo chmod +x /usr/local/bin/loki
# Скачиваем Promtail (агент для отправки логов)
wget https://github.com/grafana/loki/releases/latest/download/promtail-linux-amd64.zip
unzip promtail-linux-amd64.zip
sudo mv promtail-linux-amd64 /usr/local/bin/promtail
sudo chmod +x /usr/local/bin/promtail
Для безопасности запускаем сервисы от отдельных системных пользователей:
sudo useradd --system --no-create-home --shell /bin/false loki
sudo useradd --system --no-create-home --shell /bin/false promtail
sudo mkdir -p /var/lib/loki /etc/loki
sudo chown -R loki:loki /var/lib/loki /etc/loki
Создаём файл /etc/loki/loki-config.yaml:
auth_enabled: false
server:
http_listen_port: 3100
grpc_listen_port: 9096
common:
path_prefix: /var/lib/loki
storage:
filesystem:
directory: /var/lib/loki/chunks
replication_factor: 1
ring:
instance_addr: 127.0.0.1
kvstore:
store: inmemory
schema_config:
configs:
- from: 2020-01-01
store: tsdb
object_store: filesystem
schema: v13
index:
prefix: index_
period: 24h
Создаём юнит /etc/systemd/system/loki.service:
[Unit]
Description=Loki log aggregation server
After=network.target
[Service]
Type=notify
User=loki
Group=loki
ExecStart=/usr/local/bin/loki -config.file=/etc/loki/loki-config.yaml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Запускаем:
sudo systemctl daemon-reload
sudo systemctl start loki
sudo systemctl enable loki
sudo systemctl status loki # проверяем, что всё зелёное
Создаём конфиг /etc/promtail/promtail-config.yaml:
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/promtail-position.yaml
clients:
- url: http://127.0.0.1:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/*.log
- job_name: nginx
static_configs:
- targets:
- localhost
labels:
job: nginx
__path__: /var/log/nginx/*.log
Создаём systemd-юнит для Promtail — /etc/systemd/system/promtail.service:
[Unit]
Description=Promtail log shipper for Loki
After=network.target
[Service]
Type=notify
User=promtail
Group=promtail
ExecStart=/usr/local/bin/promtail -config.file=/etc/promtail/promtail-config.yaml
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
Запускаем:
sudo systemctl daemon-reload
sudo systemctl start promtail
sudo systemctl enable promtail
Grafana можно поставить из официального репозитория:
sudo apt install -y software-properties-common
sudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"
wget -q -O - https://packages.grafana.com/gpg.key | sudo gpg --dearmor -o /usr/share/keyrings/grafana.gpg
echo "deb [signed-by=/usr/share/keyrings/grafana.gpg] https://packages.grafana.com/oss/deb stable main" | sudo tee /etc/apt/sources.list.d/grafana.list
sudo apt update
sudo apt install grafana
sudo systemctl start grafana-server
sudo systemctl enable grafana-server
Теперь Grafana доступна по адресу: http://ваш_сервер:3000 (логин/пароль по умолчанию — admin/admin).
http://127.0.0.1:3100Готово! Теперь заходи в Explore, выбирай Loki и пиши запросы вроде:
{job="varlogs"} |= "error"
— и смотри, что ломается в реальном времени.
/var/log/.journalctl + отдельный скрипт или настроить scrape_configs с __path__: /var/log/journal/*.Вот и всё. Никаких контейнеров, никакой магии — только бинарники, конфиги и systemd. Как в старые добрые времена!
Ещё примеры LogQL:
{job="varlogs"} |~ "fail|error|exception" — регулярка{job="varlogs"} | json | level="error" — если логи в JSONcount_over_time({job="varlogs"} |= "500"[5m]) — сколько 500-х ошибок за 5 минутВ Grafana можно создать правило:
count_over_time({job="varlogs"} |= "Segmentation fault"[1m]) > 0Теперь, если твоя программа упадёт с segfault — ты узнаешь об этом сразу.
Grafana Loki — это современный, экономичный и простой способ собирать и анализировать логи. Он не заменит тебе мозги, но даст глаза. Особенно удобен, если ты уже используешь Prometheus и Grafana для метрик.
Попробуй развернуть его у себя — даже на старом Raspberry Pi. А если захочешь масштабировать на десятки серверов, Loki легко перейдёт в кластерный режим с S3 или MinIO для хранения.
Пишите в комменты, если хотите статью про Loki + systemd-журналы или как отправлять логи с ESP32 через HTTP (да, такое тоже можно!).
Удачи в автоматизации!
Блог только запустил, все статьи генерирую через нейросеть т.к. лень, возможны ошибки. Просто чтобы вы знали и не запускали ядерный реактор по моим статьям ))
Если у вас есть вопросы, или Нашли неточность? пишите в коментах — вместе поправим и сделаем статью более качественной. Я лично объясню нюансы из практики.
Комментарии
Пока нет комментариев. Будьте первым!