1. Зачем нужен централизованный сбор логов?
Когда в инфраструктуре больше двух серверов и пары сетевых устройств, подключаться по SSH на каждый узел для анализа `tail -f /var/log/syslog` становится неэффективно. Сбор логов в единое хранилище решает сразу три ключевые задачи:
- Ускорение расследования инцидентов (Troubleshooting): Возможность коррелировать события с разных серверов и сетевого оборудования на едином временном отрезке.
- Безопасность и аудит: Даже если злоумышленник получит root-доступ к серверу и затрёт локальные логи, их копия уже будет сохранена на удалённом сервере логов.
- Удобный поиск и визуализация: Быстрый фильтр по ключевым словам, сервисам, уровню важности (ERROR, WARN, INFO) и построение графиков активности.
• Promtail: Агент-сборщик логов, который вычитывает локальные файлы или принимает Syslog-трафик.
• Grafana Loki: Высокопроизводительное хранилище логов, индексирующее только метки (labels), а не весь текст.
• Grafana: Веб-интерфейс для дашбордов, поиска по логам (язык LogQL) и настройки уведомлений.
2. Развертывание Grafana + Loki + Promtail в Docker Compose
Создадим каталог для стека и развернём все сервисы в изолированных контейнерах.
Шаг 2.1. Подготовка структуры и файлов конфигурации
mkdir -p /opt/loki-stack && cd /opt/loki-stack
Создайте файл конфигурации для Loki — loki-config.yaml:
auth_enabled: false
server:
http_listen_port: 3100
ingester:
lifecycler:
address: 127.0.0.1
ring:
kvstore:
store: inmemory
replication_factor: 1
chunk_idle_period: 1m
chunk_retain_period: 30s
schema_config:
configs:
- from: 2020-05-15
store: boltdb-shipper
object_store: filesystem
schema: v11
index:
prefix: index_
period: 24h
storage_config:
boltdb_shipper:
active_index_directory: /loki/index
cache_location: /loki/index_cache
shared_store: filesystem
filesystem:
directory: /loki/chunks
limits_config:
enforce_metric_name: false
reject_old_samples: true
reject_old_samples_max_age: 168h
Создайте файл конфигурации Promtail для приёма Syslog — promtail-config.yaml:
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
host: log-server
__path__: /var/log/*.log
# Прием логов по протоколу Syslog (UDP) от сетевых устройств
- job_name: syslog
syslog:
listen_address: 0.0.0.0:1514
idle_timeout: 1h
label_job: syslog
relabel_configs:
- source_labels: ['__syslog_message_hostname']
target_label: 'host'
Шаг 2.2. Запуск через docker-compose.yml
version: "3.8"
services:
loki:
image: grafana/loki:2.9.0
container_name: loki
ports:
- "3100:3100"
volumes:
- ./loki-config.yaml:/etc/loki/loki-config.yaml
command: -config.file=/etc/loki/loki-config.yaml
restart: always
promtail:
image: grafana/promtail:2.9.0
container_name: promtail
ports:
- "1514:1514/udp"
volumes:
- ./promtail-config.yaml:/etc/promtail/promtail-config.yaml
- /var/log:/var/log
command: -config.file=/etc/promtail/promtail-config.yaml
restart: always
grafana:
image: grafana/grafana:latest
container_name: grafana
ports:
- "3000:3000"
environment:
- GF_SECURITY_ADMIN_PASSWORD=SECURE_PASSWORD
volumes:
- grafana_data:/var/lib/grafana
restart: always
volumes:
grafana_data:
Запустите сервис:
docker compose up -d
3. Настройка отправки логов с устройств (MikroTik / Linux)
Отправка логов с MikroTik RouterOS
Подключитесь к роутеру через WinBox или SSH и настройте отправку логов в Syslog (на IP вашего сервера логов и порт `1514`):
/system logging action add name=syslog-server remote=192.168.88.10 remote-port=1514 target=remote
/system logging add action=syslog-server topics=info,warning,error
Отправка логов с Linux (rsyslog)
В файле /etc/rsyslog.conf на удаленном Linux-сервере добавьте строку:
*.* @192.168.88.10:1514
Перезапустите службу: sudo systemctl restart rsyslog
4. Подключение Источника Данных в Grafana
1. Откройте веб-интерфейс Grafana:
http://<IP_СЕРВЕРА>:3000.2. Перейдите в Connections → Data Sources → Add data source.
3. Выберите Loki и укажите URL:
http://loki:3100.4. Нажмите Save & test.
5. Откройте вкладку Explore и введите запрос LogQL:
{job="syslog"} или {host="log-server"}.