Документация
Коллекторы
Агент devlogs-collector для Docker, Kubernetes, nginx, CI и других источников — без встраивания SDK.
devlogs-collector — агент для инфраструктуры без встраивания SDK в каждый сервис. Достаточно API-ключа: агент сам создаёт проекты, группирует ошибки в issues и шлёт события в ingest. Управление и DSN — в кабинете → Коллекторы.
Когда использовать
- Docker Compose / Docker на VPS — логи контейнеров, exit code, OOM без правок кода приложений.
- Kubernetes — pod logs и Warning events с DaemonSet.
- Инфраструктура — nginx, PostgreSQL, Redis, journald, syslog.
- CI и observability — GitHub/GitLab webhooks, Alertmanager, health probes.
Запуск с вашими сервисами (Docker Compose)
Один контейнер devlogs-collector в вашем docker-compose следит за всеми сервисами stack: логи, падения и OOM попадают в DevLogs без правок кода и без SDK в каждом образе.
- API-ключ. Профиль кабинета → создайте ключ dl_live_… — одного ключа хватает на все compose stack организации.
- Добавьте коллектор в свой compose. В существующий docker-compose.yml добавьте сервис devlogs-collector (см. пример). Ваши api, worker, nginx менять не нужно.
- Запустите stack. export DEVLOGS_API_KEY=dl_live_… && docker compose up -d — поднимутся и приложения, и коллектор.
- Коллектор следит за контейнерами. Через docker.sock агент читает stdout/stderr. По умолчанию — только контейнеры docker compose (не CI helper без labels). Явный whitelist: DEVLOGS_DOCKER_SERVICES=api,worker,db. На сервере с GitFlic/GitLab runner не включайте DEVLOGS_DOCKER_ALL_CONTAINERS.
- Смотрите issues в кабинете. Кабинет → Коллекторы: один проект на compose stack (имя stack), внутри — issue groups по сервисам (api, worker, …). DSN можно скопировать для SDK, если понадобится.
| Уровень | Откуда | В DevLogs |
|---|---|---|
| Compose stack | com.docker.compose.project=mystack | Один DevLogs-проект: collectorKey docker:{host}:mystack |
| Сервис api | compose service name api | Issue group type=docker.service.api — ошибки api в одном проекте |
| Сервис worker | compose service name worker | Issue group type=docker.service.worker |
| Что собирается | stderr/stdout, die, OOM | Строки error/fatal/panic и ненулевой exit code контейнера |
# Положите рядом с docker-compose.yml или экспортируйте в shell DEVLOGS_API_KEY=dl_live_YOUR_KEY_FROM_PROFILE DEVLOGS_SERVER_URL=https://dev-logs.ru DEVLOGS_ENVIRONMENT=production # DEVLOGS_DOCKER_PROJECT_MAP=stack # по умолчанию: один проект на compose stack # DEVLOGS_DOCKER_SERVICES=api,worker,db # db,redis или billing:db,shop:postgres # DEVLOGS_DOCKER_COMPOSE_PROJECT=billing,shop # опционально — только эти compose project
# docker-compose.yml — ваши сервисы + мониторинг DevLogs
# Имя compose project (mystack) → один проект в кабинете; сервисы api/worker → issue groups
services:
api:
image: myorg/api:latest
restart: unless-stopped
environment:
DATABASE_URL: postgres://app@db:5432/app
depends_on:
- db
worker:
image: myorg/worker:latest
restart: unless-stopped
depends_on:
- db
db:
image: postgres:16-alpine
restart: unless-stopped
volumes:
- pgdata:/var/lib/postgresql/data
# Sidecar: читает логи ВСЕХ контейнеров этого compose через docker.sock
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_ENVIRONMENT: ${DEVLOGS_ENVIRONMENT:-production}
DEVLOGS_DOCKER_PROJECT_MAP: ${DEVLOGS_DOCKER_PROJECT_MAP:-stack}
# DEVLOGS_DOCKER_SERVICES: api,worker,db
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
pgdata:
devlogs-collector-cache:# 1. Ключ из кабинета → профиль
export DEVLOGS_API_KEY=dl_live_YOUR_KEY
# 2. Запуск stack (api, worker, db + коллектор)
docker compose up -d
# 3. Проверка коллектора
docker compose logs -f devlogs-collector
docker run --rm -e DEVLOGS_API_KEY -e DEVLOGS_SERVER_URL \
registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 doctor
# 4. Симуляция ошибки в сервисе (опционально)
docker compose exec api node -e "console.error('test error'); process.exit(1)"api, worker) становятся issue groups внутри одного проекта stack. Менять образы приложений или добавлять SDK не нужно — достаточно sidecar devlogs-collector с доступом к docker.sock.Только база данных (PostgreSQL / MySQL / Redis)
Укажите whitelist в DEVLOGS_DOCKER_SERVICES: несколько сервисов через запятую (db,redis), в том числе из разных compose-файлов на одном хосте — формат composeProject:service (billing:db,shop:postgres). Без whitelist режим docker смотрит все контainers на хосте.
- API-ключ. Профиль кабинета → ключ dl_live_…
- Список источников. DEVLOGS_DOCKER_SERVICES=db,redis — сервисы с любых compose stack на хосте с такими именами. Для разных файлов и одинаковых имён: billing:db,shop:db — compose project name (docker compose -p billing или имя каталога) + сервис.
- Ограничить stack'и (опционально). DEVLOGS_DOCKER_COMPOSE_PROJECT=billing,shop — только контейнеры из перечисленных compose project; вместе с DEVLOGS_DOCKER_SERVICES=db,api — db/api только из billing и shop.
- Коллектор. Один контейнер devlogs-collector с docker.sock — может жить в отдельном compose, источники задаются только env.
- Кабинет → Коллекторы. Отдельный DevLogs-проект на каждый compose project (billing, shop…); issue groups по сервисам (docker.service.db).
| Способ | command | Что собирается | collectorKey / группа |
|---|---|---|---|
| Несколько сервисов | DEVLOGS_DOCKER_SERVICES=db,redis,postgres | Любые stack на хосте, где есть эти compose service names | docker:{hostId}:{project} → docker.service.* |
| Разные compose-файлы | DEVLOGS_DOCKER_SERVICES=billing:db,shop:postgres,cache:redis | Точная пара project:service — stack из другого docker-compose.yml | проект billing / shop / cache |
| Stack + сервисы | COMPOSE_PROJECT=billing,shop + SERVICES=db,api | db и api только из billing и shop, остальные stack игнорируются | — |
| Tail log-файла | command: ["postgres", …] | Без docker.sock — один log-файл | postgres:{hostId}:{instance} |
# docker-compose.yml — PostgreSQL + коллектор (только сервис db)
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_ENVIRONMENT: ${DEVLOGS_ENVIRONMENT:-production}
DEVLOGS_DOCKER_PROJECT_MAP: ${DEVLOGS_DOCKER_PROJECT_MAP:-stack}
# Только этот compose-сервис; api/worker не будут собираться
DEVLOGS_DOCKER_SERVICES: db
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
pgdata:
devlogs-collector-cache:# api есть в stack, но коллектор смотрит только db
services:
api:
image: myorg/api:latest
restart: unless-stopped
depends_on:
- db
db:
image: postgres:16-alpine
restart: unless-stopped
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_DOCKER_SERVICES: db
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
devlogs-collector-cache:# Коллектор в отдельном compose — источники из ДРУГИХ docker-compose.yml на том же хосте
#
# На хосте уже запущено (в разных каталогах / разных -p):
# /opt/billing/docker compose -p billing up -d → сервис db
# /opt/shop/docker compose -p shop up -d → сервис postgres
# /opt/cache/docker compose -p cache up -d → сервис redis
#
# compose project name = -p billing или имя каталога по умолчанию.
# Проверка: docker inspect <container> --format '{{index .Config.Labels "com.docker.compose.project"}}'
services:
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_ENVIRONMENT: ${DEVLOGS_ENVIRONMENT:-production}
# project:service — каждая пара из своего compose-файла
DEVLOGS_DOCKER_SERVICES: billing:db,shop:postgres,cache:redis
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
devlogs-collector-cache:# Несколько БД на хосте — по имени сервиса (без project:)
# Подойдёт, если в разных stack сервисы называются db, postgres, redis и нет лишних одноимённых.
services:
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_DOCKER_SERVICES: db,postgres,redis
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
devlogs-collector-cache:# Альтернатива: subcommand postgres — docker.sock не нужен
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
POSTGRES_DB: app
command:
- postgres
- -c
- logging_collector=on
- -c
- log_directory=/var/log/postgresql
- -c
- log_filename=postgresql.log
- -c
- log_min_messages=warning
volumes:
- pgdata:/var/lib/postgresql/data
- pglogs:/var/log/postgresql
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command:
- postgres
- --path
- /var/log/postgresql/postgresql.log
- --instance
- main
restart: unless-stopped
depends_on:
- db
volumes:
- pglogs:/var/log/postgresql:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
pgdata:
pglogs:
devlogs-collector-cache:services:
redis:
image: redis:7-alpine
restart: unless-stopped
command: ["redis-server", "--loglevel", "warning"]
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_DOCKER_SERVICES: redis
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
devlogs-collector-cache:# Несколько stack на одном хосте (разные compose-файлы)
export DEVLOGS_API_KEY=dl_live_YOUR_KEY
export DEVLOGS_DOCKER_SERVICES=billing:db,shop:postgres,cache:redis
# Узнать compose project name контейнера:
docker inspect billing-db-1 \
--format '{{index .Config.Labels "com.docker.compose.project"}} {{index .Config.Labels "com.docker.compose.service"}}'
# Запуск только коллектора
docker compose up -d
docker compose logs -f devlogs-collector
# CLI:
# devlogs-collector docker --services billing:db,shop:postgres,cache:redis
docker run --rm -e DEVLOGS_API_KEY -e DEVLOGS_SERVER_URL \
registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 doctordb,redis (сервис с любого stack на хосте), billing:db,shop:postgres (пара compose project + service — для разных docker-compose.yml). Имя project: docker compose -p billing или label com.docker.compose.project. Пустое значение — только контейнеры docker compose (без эфемерных CI job). Все контейнеры на хосте: DEVLOGS_DOCKER_ALL_CONTAINERS=true.Быстрый старт (только коллектор)
- Создайте API-ключ
dl_live_…в профиле кабинета. - Запустите агент с доступом к
docker.sock. - Откройте Коллекторы — появятся auto-provisioned проекты и DSN для копирования.
services:
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_DOCKER_PROJECT_MAP: ${DEVLOGS_DOCKER_PROJECT_MAP:-stack}
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
devlogs-collector-cache:docker run -d --name devlogs-collector \ -e DEVLOGS_API_KEY=dl_live_YOUR_KEY \ -v /var/run/docker.sock:/var/run/docker.sock:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 docker
На том же хосте, что DevLogs, укажите DEVLOGS_SERVER_URL=http://127.0.0.1:3050 и при необходимости network_mode: host — так обходится rate limit публичного nginx.
Docker: проекты, группы и фильтр сервисов
По умолчанию (DEVLOGS_DOCKER_PROJECT_MAP=stack):
| Уровень | Пример | Описание |
|---|---|---|
| Проект | docker:prod-1:mystack | Один DevLogs-проект на compose stack (com.docker.compose.project) |
| Issue group | type=docker.service.api | Группы внутри проекта по сервису и нормализованному тексту ошибки |
Повторяющиеся ошибки одного сервиса попадают в существующую группу (fingerprint на сервере). Legacy-режим — отдельный проект на каждый service: DEVLOGS_DOCKER_PROJECT_MAP=service.
Фильтр источников: DEVLOGS_DOCKER_SERVICES=db,redis — whitelist имён compose-сервисов. Без whitelist — только compose-контейнеры (CI job без labels игнорируются). Все контейнеры: DEVLOGS_DOCKER_ALL_CONTAINERS=true. См. также только база данных.
Источники (команды)
| Команда | Статус | Описание |
|---|---|---|
| devlogs-collector docker | Available | Sidecar в compose: логи api/worker через docker.sock. Stack → проект, сервис → issue group. |
| devlogs-collector k8s | Available | Pod logs и Warning events. |
| devlogs-collector file | Available | Tail произвольного log-файла. |
| devlogs-collector syslog | Available | TCP/UDP syslog receiver. |
| devlogs-collector socket | Available | Line-delimited logs на unix socket. |
| devlogs-collector webhook | Available | Generic JSON webhook receiver. |
| devlogs-collector journald | Available | journalctl err..alert. |
| devlogs-collector nginx | Available | error.log и 5xx access.log. |
| devlogs-collector postgres | Available | Tail PostgreSQL log. |
| devlogs-collector mysql | Available | Tail MySQL error log. |
| devlogs-collector redis | Available | Tail Redis server log. |
| devlogs-collector github | Available | CI workflow_run failures. |
| devlogs-collector gitlab | Available | Pipeline failure webhooks. |
| devlogs-collector alertmanager | Available | Prometheus Alertmanager webhooks. |
| devlogs-collector otel | Partial | HTTP OTLP/JSON log bridge. |
| devlogs-collector rabbitmq | Available | Log tail или management poll. |
| devlogs-collector kafka | Available | Broker log tail. |
| devlogs-collector nats | Available | Server log tail. |
| devlogs-collector probe | Available | Synthetic HTTP/TCP checks. |
Подробные примеры запуска для каждого источника — в разделе Примеры запуска.
Примеры запуска по всем источникам
Один бинарник/образ devlogs-collector — разные subcommand. Меняется только последний аргумент (docker, nginx, k8s …) и флаги. API-ключ один на агент; проекты создаются автоматически по collectorKey.
devlogs-collector doctor. На нескольких источниках одного хоста — несколько контейнеров/systemd unit с разными command.# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector
export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru devlogs-collector doctor # или в Docker: docker run --rm -e DEVLOGS_API_KEY -e DEVLOGS_SERVER_URL \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 doctor
Контейнеры и оркестрация
Docker
Логи контейнеров, exit code, OOM. Нужен доступ к docker.sock.
collectorKey: docker:{hostId}:{composeProject}
devlogs-collector docker
services:
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_DOCKER_PROJECT_MAP: ${DEVLOGS_DOCKER_PROJECT_MAP:-stack}
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
devlogs-collector-cache:docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /var/run/docker.sock:/var/run/docker.sock:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 docker
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector # /etc/systemd/system/devlogs-collector-docker.service [Service] Type=simple Environment=DEVLOGS_API_KEY=dl_live_… Environment=DEVLOGS_SERVER_URL=https://dev-logs.ru Environment=DEVLOGS_DOCKER_PROJECT_MAP=stack ExecStart=/usr/local/bin/devlogs-collector docker Restart=always
DEVLOGS_DOCKER_PROJECT_MAP=stack — один проект на compose stack. DEVLOGS_DOCKER_SERVICES=db,redis или billing:db,shop:postgres — whitelist (несколько stack на хосте). CLI: docker --services billing:db,shop:postgres
Kubernetes
Pod logs и Warning events. Запуск в кластере с ServiceAccount.
collectorKey: k8s:{cluster}:{namespace}:{deployment}
devlogs-collector k8s --cluster production
# Фрагмент DaemonSet (полный манифест: dev-logs-sdk/collectors/deploy/k8s/daemonset.yaml)
containers:
- name: collector
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
args: ["k8s", "--cluster", "production"]
env:
- name: DEVLOGS_API_KEY
valueFrom:
secretKeyRef:
name: devlogs-collector
key: api-key
- name: DEVLOGS_SERVER_URL
value: "https://dev-logs.ru"
# ServiceAccount + ClusterRole: pods, pods/log, events (get/list/watch)# Обычно DaemonSet в кластере (см. compose ниже). Локально с kubeconfig: docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v $HOME/.kube/config:/root/.kube/config:ro \ -e KUBERNETES_TOKEN=$(kubectl create token devlogs-collector -n devlogs) \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 k8s --cluster production --namespace app
# На worker-ноде вне кластера — используйте kubeconfig и KUBERNETES_TOKEN # Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector k8s --cluster production --namespace app
Флаги: --cluster (имя в collectorKey), --namespace (пусто = все ns), --kubeconfig. В Pod автоматически используется service account token.
Транспорты (file, syslog, socket, webhook)
File tail
Tail произвольного log-файла на хосте.
collectorKey: file:{hostId}:{key}
devlogs-collector file --path /var/log/myapp/app.log --key myapp
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /var/log/myapp:/var/log/myapp:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 file \ --path /var/log/myapp/app.log \ --key myapp \ --name "myapp logs"
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector file \ --path /var/log/myapp/app.log \ --key myapp \ --name "myapp logs"
--path и --key обязательны. --name — отображаемое имя проекта в кабинете.
Syslog (TCP/UDP)
Приём syslog на порту 1514. Ключ — по IP отправителя.
collectorKey: syslog:{hostId}:{remoteIp}
devlogs-collector syslog --listen :1514 --proto udp
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -p 1514:1514/udp \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 syslog --listen :1514 --proto udp
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector syslog --listen :1514 --proto udp
rsyslog: `*.* @collector-host:1514`. TCP: --proto tcp и -p 1514:1514.
Unix socket
Line-delimited логи через unix socket.
collectorKey: socket:{hostId}:{key}
devlogs-collector socket --path /run/myapp/log.sock --key myapp
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /run/myapp:/run/myapp \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 socket \ --path /run/myapp/log.sock \ --key myapp
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector socket \ --path /run/myapp/log.sock \ --key myapp
Приложение пишет строки в socket; агент читает и шлёт в DevLogs.
HTTP webhook (generic)
POST JSON/text на /hooks/{key}. Универсальный приёмник.
collectorKey: webhook:{hostId}:{key}
devlogs-collector webhook --listen :9095 --adapter generic
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -p 9095:9095 \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 webhook \ --listen :9095 \ --adapter generic \ --secret your-shared-secret
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector webhook \ --listen :9095 \ --adapter generic \ --secret your-shared-secret
POST http://collector:9095/hooks/my-service с телом {"message":"…"} или plain text. Заголовок X-DevLogs-Secret если задан --secret.
Инфраструктура (journald, nginx, БД)
Для compose только с БД см. раздел Только база данных. Ниже — отдельные команды для bare metal и tail log-файлов.
systemd journald
journalctl priority err..alert. Опционально фильтр по unit.
collectorKey: journald:{hostId}:{unit|all}
devlogs-collector journald
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ --pid host \ -v /run/systemd/journal:/run/systemd/journal:ro \ -v /var/log/journal:/var/log/journal:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 journald --unit nginx.service
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector journald --unit nginx.service
Без --unit — все юниты с err..alert. Контейнеру нужен доступ к journal на хосте.
Nginx
error.log или 5xx в access.log.
collectorKey: nginx:{hostId}:{site}
devlogs-collector nginx --site mysite --mode error
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /var/log/nginx:/var/log/nginx:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 nginx \ --path /var/log/nginx/error.log \ --site mysite \ --mode error
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector nginx \ --path /var/log/nginx/error.log \ --site mysite \ --mode error
--mode access — только HTTP 5xx из access.log. --site — суффикс collectorKey.
PostgreSQL
Compose только с db — режим docker; или tail log-файла на bare metal.
collectorKey: postgres:{hostId}:{instance} (tail) · docker.service.db (режим docker)
devlogs-collector postgres --instance main
# docker-compose.yml — PostgreSQL + коллектор (только сервис db)
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: app
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-changeme}
POSTGRES_DB: app
volumes:
- pgdata:/var/lib/postgresql/data
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_ENVIRONMENT: ${DEVLOGS_ENVIRONMENT:-production}
DEVLOGS_DOCKER_PROJECT_MAP: ${DEVLOGS_DOCKER_PROJECT_MAP:-stack}
# Только этот compose-сервис; api/worker не будут собираться
DEVLOGS_DOCKER_SERVICES: db
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
pgdata:
devlogs-collector-cache:docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /var/log/postgresql:/var/log/postgresql:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 postgres \ --path /var/log/postgresql/postgresql-16-main.log \ --instance main
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector postgres \ --path /var/log/postgresql/postgresql-16-main.log \ --instance main
Compose только с PostgreSQL: DEVLOGS_DOCKER_SERVICES=db — см. #database-only. Tail файла: postgres subcommand без docker.sock.
MySQL / MariaDB
Compose только с MySQL — режим docker; или tail error.log.
collectorKey: mysql:{hostId}:{instance} (tail) · docker.service.db (режим docker)
devlogs-collector mysql --instance main
services:
db:
image: mysql:8
restart: unless-stopped
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-changeme}
MYSQL_DATABASE: app
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_DOCKER_SERVICES: db
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
devlogs-collector-cache:docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /var/log/mysql:/var/log/mysql:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 mysql --path /var/log/mysql/error.log --instance main
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector mysql \ --path /var/log/mysql/error.log \ --instance main
См. #database-only — для compose без приложения достаточно command: ["docker"].
Redis
Compose только с Redis — режим docker; или tail redis-server.log.
collectorKey: redis:{hostId}:{instance} (tail) · docker.service.redis (режим docker)
devlogs-collector redis --instance main
services:
redis:
image: redis:7-alpine
restart: unless-stopped
command: ["redis-server", "--loglevel", "warning"]
devlogs-collector:
image: registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5
command: ["docker"]
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- devlogs-collector-cache:/var/lib/devlogs-collector
environment:
DEVLOGS_API_KEY: ${DEVLOGS_API_KEY}
DEVLOGS_SERVER_URL: ${DEVLOGS_SERVER_URL:-https://dev-logs.ru}
DEVLOGS_DOCKER_SERVICES: redis
DEVLOGS_COLLECTOR_CACHE_DIR: /var/lib/devlogs-collector
volumes:
devlogs-collector-cache:docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /var/log/redis:/var/log/redis:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 redis --path /var/log/redis/redis-server.log --instance main
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector redis \ --path /var/log/redis/redis-server.log \ --instance main
См. #database-only — stderr redis-server подхватывается в режиме docker.
CI и observability
GitHub Actions
Webhook workflow_run (failures). Публикуйте URL наружу.
collectorKey: ci:github:{owner/repo}
devlogs-collector github --listen :9096
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -p 9096:9096 \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 github --listen :9096 --secret ghp_webhook_secret
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector github \ --listen :9096 \ --secret ghp_webhook_secret
GitHub → Settings → Webhooks → Payload URL: http://collector:9096/hooks/my-repo (или через reverse proxy). Events: Workflow runs. Заголовок X-DevLogs-Secret если задан --secret.
GitLab CI
Pipeline failure webhooks.
collectorKey: ci:gitlab:{group/project}
devlogs-collector gitlab --listen :9097
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -p 9097:9097 \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 gitlab --listen :9097 --secret gitlab-token
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector gitlab --listen :9097 --secret gitlab-token
GitLab → Project → Webhooks → Pipeline events → URL http://collector:9097/hooks/my-group-my-project.
Alertmanager
Prometheus Alertmanager firing alerts.
collectorKey: alertmanager:{hostId}:{alertname}
devlogs-collector alertmanager --listen :9098
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -p 9098:9098 \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 alertmanager --listen :9098
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector alertmanager --listen :9098
alertmanager.yml receivers: webhook_configs url http://collector:9098/hooks/prometheus — firing alerts попадут в DevLogs.
OpenTelemetry bridge
HTTP OTLP/JSON на /v1/logs и /v1/traces (partial).
collectorKey: otel:{hostId}:{serviceName}
devlogs-collector otel --listen :4319
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -p 4319:4319 \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 otel --listen :4319
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector otel --listen :4319
Экспортер OTel → http://collector:4319/v1/logs. Статус Partial — не все поля OTLP маппятся.
Health probe
Synthetic HTTP или TCP проверки по интервалу.
collectorKey: probe:{hostId}:{hash}
devlogs-collector probe --url https://api.example.com/health --interval 1m
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 probe \ --url https://api.example.com/health \ --interval 1m
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector probe \ --url https://api.example.com/health \ --interval 1m
TCP: --tcp db.example.com:5432 вместо --url. Ошибки probe → события error в DevLogs.
Очереди (RabbitMQ, Kafka, NATS)
RabbitMQ
Tail лога или poll Management API.
collectorKey: rabbitmq:{hostId}:{instance}
devlogs-collector rabbitmq --log-path /var/log/rabbitmq/rabbit@host.log
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /var/log/rabbitmq:/var/log/rabbitmq:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 rabbitmq \ --log-path /var/log/rabbitmq/rabbit@host.log \ --instance main
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector rabbitmq \ --log-path /var/log/rabbitmq/rabbit@host.log \ --instance main
Альтернатива: --mgmt-url http://127.0.0.1:15672 (нужны credentials в env RabbitMQ).
Kafka
Tail broker server.log.
collectorKey: kafka:{hostId}:{instance}
devlogs-collector kafka --path /var/log/kafka/server.log
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /var/log/kafka:/var/log/kafka:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 kafka \ --path /var/log/kafka/server.log \ --instance broker-1
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector kafka \ --path /var/log/kafka/server.log \ --instance broker-1
NATS
Tail NATS server log.
collectorKey: nats:{hostId}:{instance}
devlogs-collector nats --path /var/log/nats/nats.log
docker run -d --name devlogs-collector \ --restart unless-stopped \ -e DEVLOGS_API_KEY \ -e DEVLOGS_SERVER_URL \ -e DEVLOGS_ENVIRONMENT \ -v devlogs-collector-cache:/var/lib/devlogs-collector \ -e DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector \ -v /var/log/nats:/var/log/nats:ro \ registry.melnikovit.ru/dev-logs/devlogs-collector:0.5.5 nats --path /var/log/nats/nats.log --instance main
# Обязательно для любого источника export DEVLOGS_API_KEY=dl_live_YOUR_KEY export DEVLOGS_SERVER_URL=https://dev-logs.ru export DEVLOGS_ENVIRONMENT=production # export DEVLOGS_COLLECTOR_HOST_ID=my-server # по умолчанию hostname # export DEVLOGS_COLLECTOR_CACHE_DIR=/var/lib/devlogs-collector ExecStart=/usr/local/bin/devlogs-collector nats \ --path /var/log/nats/nats.log \ --instance main
Переменные окружения
| Переменная | Обязательна | Описание |
|---|---|---|
| DEVLOGS_API_KEY | да | API-ключ dl_live_… из профиля |
| DEVLOGS_SERVER_URL | нет | Базовый URL API (по умолчанию https://dev-logs.ru) |
| DEVLOGS_ENVIRONMENT | нет | Тег environment в событиях (production, staging…) |
| DEVLOGS_DOCKER_PROJECT_MAP | нет | stack (default) или service — маппинг Docker Compose |
| DEVLOGS_DOCKER_SERVICES | нет | Whitelist: db,redis или billing:db,shop:postgres (несколько stack на хосте) |
| DEVLOGS_DOCKER_COMPOSE_PROJECT | нет | Только эти compose project (billing,shop) — через запятую |
| DEVLOGS_DOCKER_EXCLUDE_SERVICES | нет | Исключить сервисы (когда whitelist не задан) |
| DEVLOGS_DOCKER_ALL_CONTAINERS | нет | true — все контейнеры на хосте (не на серверах с CI runner) |
| DEVLOGS_COLLECTOR_CACHE_DIR | нет | Кэш collectorKey → DSN (~/.devlogs-collector) |
REST API для агентов
Коллектор вызывает POST /api/v1/projects/ensure с collectorKey и получает DSN. Поиск существующего проекта — GET /api/v1/projects?collectorKey=….
POST /api/v1/projects/ensure
Authorization: Bearer dl_live_xxxxxxxx
Content-Type: application/json
{
"name": "docker / mystack",
"collectorKey": "docker:host1:mystack"
}Удаление проекта коллектора
Если вы удалили auto-provisioned проект в кабинете, его collectorKey попадает в блок-лист организации. POST /api/v1/projects/ensure вернёт 410 collector_key_revoked — агент перестаёт слать события и не создаёт дубликат. Локально ключ сохраняется в revoked-keys.json.
Включить сбор снова: в кабинете Коллекторы → Отозванные ключи нажмите «Включить снова» (нужна роль member и выше) или вызовите POST /api/v1/collector-keys/restore с телом {"collectorKey":"…"}. После восстановления на сервере удалите ключ из локального revoked-keys.json или перезапустите коллектор — иначе агент продолжит игнорировать ключ.
Версия
Текущий образ: devlogs-collector:0.5.5. Проверка: devlogs-collector doctor.
Дальше
- Кабинет → Коллекторы — таблица проектов и DSN.
- Быстрый старт — если подключаете SDK в приложение.
- Алерты — уведомления по новым issues.