Я часто упоминал в различных заметках систему по сбору логов Loki.
Проект относительно новый, стартовал в 2018 году в противовес стеку ELK. Grafana решила сделать более простой и легковесный вариант хранения логов немного с другой моделью анализа, без полной индексации текстов логов, используя вместо этого метки для потоков. На деле получился хороший продукт, интегрированный в стек Grafana + Prometheus с похожей идеологией хранения и поиска (язык запросов LogQL по аналогии с PromQL).
Для начала выполню базовые действия для запуска Loki и Grafana и настрою отправку логов в Loki от различных Docker контейнеров. Большее в одну заметку не уместить. Думаю, что далее я эту тему разовью.
Я не буду запускать Loki и Grafana в одном Docker Compose файле, так как им не обязательно быть установленными вместе. Grafana поддерживает весь стек своих продуктов, так что нет особого смысла поднимать её рядом со сборщиком логов.
Сначала запустим Loki. Готовим для него compose.yaml и конфигурацию в config.yaml. Не буду приводить здесь содержимое. Оно будет отправлено следующим сообщением в архиве со всеми остальными конфигурациями. Для удобства скопировал её же в gitflic.
# curl https://get.docker.com | bash -
# git clone https://gitflic.ru/project/serveradmin/grafana-loki.git
# cd grafana-loki/loki/
В файле compose.yaml укажите актуальную версию image на момент установки. Запускаем проект:
# docker compose up -d
Проверим, что сервис стартовал:
# curl http://192.168.137.29:3100
404 page not found
Это нормальный ответ. 404 нам ответил Loki. Запустим теперь Grafana:
# cd ../grafana
Указываем нужную версию в compose.yaml и запускаем:
# docker compose up -d
Идём браузером по IP сервера, где запущена Grafana на порт 3000. Учётка по умолчанию - admin / admin. Заходим в Grafana, идём в раздел Connections ⇨ Data sources ⇨ Add data source. Выбираем Loki. В качестве настроек достаточно указать только url. В моём случае это http://192.168.137.30:3100/. Мотаем страничку в самый низ и нажимаем Save & Test. Ошибок быть не должно.
Стек поднят и готов к приёму логов. Отправим туда логи контейнеров Docker. Для этого у Docker существует драйвер. Его необходимо установить на хосте:
# docker plugin install grafana/loki-docker-driver:3.6.0-amd64 --alias loki --grant-all-permissions
Проверяем, что он установился:
# docker plugin ls
018395707e37 loki:latest Loki Logging Driver true
Всё в порядке. Теперь мы можем в самом демоне Docker настроить отправку всех логов в Loki через правку его конфигурации в /etc/docker/daemon.json. Для этого туда надо добавить:
{
"debug": true,
"log-driver": "loki",
"log-opts": {
"loki-url": "http://192.168.137.30:3100//loki/api/v1/push",
"loki-batch-size": "400"
}
}
Это не очень удобно, если у нас нет желания собирать логи абсолютно всех контейнеров. Удобнее управлять этим для каждого контейнера отдельно. Для этого в compose файл достаточно добавить ещё одну секцию logging. Покажу сразу итоговый пример для запуска Grafana из этой публикации:
services:
grafana:
image: docker.io/grafana/grafana-oss:12.3.1
container_name: grafana
logging:
driver: loki
options:
loki-url: "http://192.168.137.30:3100/loki/api/v1/push"
loki-retries: 2
loki-max-backoff: 800ms
loki-timeout: 1s
keep-file: "true"
mode: "non-blocking"
ports:
- "3000:3000"
volumes:
- grafana-data:/var/lib/grafana
restart: unless-stopped
volumes:
grafana-data:
driver: local
Перезапускаем проект:
# docker compose stop
# docker compose up -d
Идём в Grafana, раздел Drilldown ⇨ Logs. Выбираем в выпадающем списке service имя контейнера и смотрим его логи.
Настройка простая и быстрая, легко автоматизируется. Далее я разовью эту тему и добавлю логи из других систем.
#loki #logs #devops