#Логи сервиса

GET /v1/infra/servers/:id/logs

Возвращает логи BLACKHOLE-сервера через системную утилиту journalctl. Без параметра service читается весь системный журнал (все сервисы и общесистемные сообщения). Для логов конкретного systemd-юнита — передайте service (по умолчанию при деплое создаётся app.service, если не указали другое имя). Поддерживает фильтрацию по количеству строк, временному окну и подстроке.

#Параметры

Параметр В Тип Обяз. По умолч. Описание
id path string (UUID) да ID BLACKHOLE-сервера
service query string нет Имя systemd-юнита: app, crm-dashboard, и т. п. Не указывайте расширение .service. По умолчанию читается весь системный журнал
lines query number нет 50 Количество строк, 1–500
since query string нет Временная метка в формате утилиты journalctl: "1 hour ago", "2026-04-22 10:00:00", "10 minutes ago"
grep query string нет Подстрока для фильтра, до 200 символов

#Примеры

#curl — личный ключ

Terminal
# Логи приложения за последний час с фильтром по "error"
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/logs?service=app&lines=100&since=1%20hour%20ago&grep=error"

# Весь системный журнал, последние 10 строк (для отладки cloud-init)
curl -H "X-Api-Key: YOUR_API_KEY" \
  "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/logs?lines=10"

#curl — OAuth-приложение

Terminal
curl -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  "https://vibecode.bitrix24.tech/v1/infra/servers/SERVER_ID/logs?service=app&lines=50"

#JavaScript — личный ключ

javascript
const params = new URLSearchParams({
  service: 'app',
  lines: '100',
  since: '30 minutes ago',
})

const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/logs?${params}`,
  { headers: { 'X-Api-Key': 'YOUR_API_KEY' } }
)
const { data } = await res.json()
data.logs.forEach(line => console.log(line))

#JavaScript — OAuth-приложение

javascript
const res = await fetch(
  `https://vibecode.bitrix24.tech/v1/infra/servers/${serverId}/logs?service=app&lines=50`,
  {
    headers: {
      'X-Api-Key': 'YOUR_APP_KEY',
      'Authorization': 'Bearer USER_SESSION_TOKEN',
    },
  }
)

#Поля ответа

Поле Тип Описание
success boolean Всегда true при успехе
data.service string | null Эхо параметра ?service=, или null если не передавался
data.logs array<string> Основное поле. Строки логов в порядке поступления (новые — в конце массива)
data.lines array<string> Алиас data.logs (тот же массив). Сохранён для backward compat — в новом коде используйте data.logs
data.requestedLines number Эхо ?lines= параметра (валидировано 1–500, default 50)
data.returnedLines number Длина data.logs
data.since string | null Эхо ?since=, или null
data.grep string | null Эхо ?grep=, или null
data.hint string Опционально. Диагностика когда data.logs.length === 0

#Пример ответа

JSON
{
  "success": true,
  "data": {
    "service": null,
    "logs": [
      "Apr 22 11:17:02 epd65hdv07p8g89c0c06 CRON[1406]: pam_unix(cron:session): session closed for user root",
      "Apr 22 11:17:27 epd65hdv07p8g89c0c06 vibe-agent[1098]: 2026/04/22 11:17:27 [exec] id= timeout=10s workdir=\"\" command=\"uname -a\"",
      "Apr 22 11:17:28 epd65hdv07p8g89c0c06 cloud-init[975]: Reading package lists..."
    ],
    "lines": [
      "Apr 22 11:17:02 epd65hdv07p8g89c0c06 CRON[1406]: pam_unix(cron:session): session closed for user root",
      "Apr 22 11:17:27 epd65hdv07p8g89c0c06 vibe-agent[1098]: 2026/04/22 11:17:27 [exec] id= timeout=10s workdir=\"\" command=\"uname -a\"",
      "Apr 22 11:17:28 epd65hdv07p8g89c0c06 cloud-init[975]: Reading package lists..."
    ],
    "requestedLines": 50,
    "returnedLines": 3,
    "since": null,
    "grep": null
  }
}

#Пример ответа при ошибке

400 — сервер в OPEN-режиме:

JSON
{
  "success": false,
  "error": {
    "code": "NOT_BLACKHOLE",
    "message": "Deployment API only available for BLACKHOLE servers"
  }
}

#Ошибки

HTTP Код Описание
400 VALIDATION_ERROR Нарушена схема: lines вне 1–500, grep длиннее 200 символов
400 NOT_BLACKHOLE Сервер в режиме OPEN — Deploy API недоступен
401 MISSING_API_KEY Не передан заголовок X-Api-Key
401 INVALID_API_KEY Неверный или просроченный API-ключ
404 NOT_FOUND Сервер не существует, удалён или принадлежит другому API-ключу
409 AGENT_NOT_CONNECTED Агент туннеля не в статусе CONNECTED
429 RATE_LIMIT_EXCEEDED Превышен лимит 10 операций в минуту на сервер
502 GATEWAY_ERROR Gateway вернул ошибку

Полный список общих ошибок API — Ошибки.

#Известные особенности

  • Формат строк — как выдаёт journalctl. Каждая строка уже содержит время, имя хоста, имя процесса и его PID — дополнительная обработка на клиенте не нужна, выводите как есть.
  • Фильтр grep — простая подстрока, не регулярное выражение. Для сложных паттернов выгружайте больше строк и фильтруйте на клиенте.
  • Логи агента туннеля видны без service — под именем vibe-agent. Полезно для диагностики, когда приложение не отвечает через Deploy API. Просто не передавайте параметр service — увидите весь системный журнал, включая vibe-agent, cloud-init и другие общесистемные сообщения.
  • Лимит 500 строк помножен на ограничение 10 вызовов в минуту — за минуту можно прочитать максимум 5000 строк. Для большего объёма логов — несколько вызовов с разными since и аккуратно к лимиту.

#Смотрите также