Skip to content

Отладка и логирование

SDK предоставляет инструменты для отладки и сбора логов.

Режим отладки

Включение при инициализации

javascript
await SDK.init({
    debug: true,      // Вывод внутренних логов SDK в консоль
    debugLog: true,   // Вызывать onDebugMessage для всех логов SDK
    // ...
});

Переключение во время работы

javascript
// Включить режим отладки (аля SDK.init({ debug: true }))
SDK.debug(true);

// Выключить режим отладки
SDK.debug(false);

Получение логов SDK

Для получения внутренних логов SDK используйте коллбэк onDebugMessage. Этот коллбэк работает когда debugLog: true и debug: false:

javascript
import { DebugMessageType } from '@vkontakte/calls-sdk';

await SDK.init({
    debug: false,      // Можно выключить вывод в консоль
    debugLog: true,    // Но получать логи через коллбэк
    
    onDebugMessage: (type, ...args) => {
        // type: DebugMessageType.ERROR | WARN | LOG | DEBUG
        
        switch (type) {
            case DebugMessageType.ERROR:
                console.error('[SDK Error]', ...args);
                break;
            case DebugMessageType.WARN:
                console.warn('[SDK Warn]', ...args);
                break;
            case DebugMessageType.LOG:
                console.log('[SDK Log]', ...args);
                break;
            case DebugMessageType.DEBUG:
                console.debug('[SDK Debug]', ...args);
                break;
        }
        
        // Сохранить лог для последующей отправки
        saveTolLogStorage(type, args);
    }
});

Добавление собственных логов

Вы можете добавлять свои сообщения в систему логирования SDK:

javascript
import { DebugMessageType } from '@vkontakte/calls-sdk';

// Логирование различных уровней
SDK.debugMessage(DebugMessageType.LOG, 'Пользователь нажал кнопку');
SDK.debugMessage(DebugMessageType.WARN, 'Предупреждение:', data);
SDK.debugMessage(DebugMessageType.ERROR, 'Ошибка:', error);
SDK.debugMessage(DebugMessageType.DEBUG, 'Отладочная информация:', details);

Отправка логов на сервер

После завершения звонка можно отправить собранные логи на сервер для анализа:

javascript
try {
    await SDK.uploadDebugLogs();
    console.log('Логи успешно отправлены');
} catch (error) {
    console.error('Не удалось отправить логи:', error);
}

Важно

uploadDebugLogs() отправляет логи на бекенд сервиса звонков. Если у вас нет доступа к этому бекенду, использовать эту функцию нет смысла.

Функция работает только если включены параметры debug: true и debugLog: true.

Скачивание логов локально

Логи можно скачать локально через глобальную функцию в консоли браузера:

javascript
// В консоли браузера
window.__VKCallsSDKLogs__();

Это скачает все логи, хранящиеся в localStorage, в виде JSON-файла.

Пример системы логирования

javascript
import * as SDK from '@vkontakte/calls-sdk';
import { DebugMessageType } from '@vkontakte/calls-sdk';

// Хранилище логов
const logs = [];
const MAX_LOGS = 5000;

function formatTimestamp() {
    const now = new Date();
    return `${now.getHours().toString().padStart(2, '0')}:${now.getMinutes().toString().padStart(2, '0')}:${now.getSeconds().toString().padStart(2, '0')}.${now.getMilliseconds().toString().padStart(3, '0')}`;
}

function addLog(level, ...args) {
    const entry = {
        timestamp: formatTimestamp(),
        level,
        data: args
    };
    
    logs.push(entry);
    
    // Ограничить размер хранилища
    if (logs.length > MAX_LOGS) {
        logs.shift();
    }
}

await SDK.init({
    debugLog: true,
    
    onDebugMessage: (type, ...args) => {
        const levelMap = {
            [DebugMessageType.ERROR]: 'error',
            [DebugMessageType.WARN]: 'warn',
            [DebugMessageType.LOG]: 'log',
            [DebugMessageType.DEBUG]: 'debug'
        };
        
        const level = levelMap[type] ?? 'log';
        addLog(level, ...args);
        
        // Вывод в консоль
        if (type === DebugMessageType.ERROR) {
            console.error('[SDK]', ...args);
        } else if (type === DebugMessageType.WARN) {
            console.warn('[SDK]', ...args);
        }
    },
    
    onHangup: async (type, conversationId) => {
        // Отправить логи при завершении звонка
        try {
            await SDK.uploadDebugLogs();
        } catch (e) {
            console.error('Не удалось отправить логи');
        }
    }
});

// Функция для получения логов
function getLogs() {
    return [...logs];
}

// Очистка логов
function clearLogs() {
    logs.length = 0;
}

Полезные данные для отладки

При отладке проблем полезно собирать:

javascript
// Информация о браузере
console.log('Browser:', SDK.browser.browserName());
console.log('Version:', SDK.browser.browserVersion());
console.log('Mobile:', SDK.browser.isMobile());
console.log('OS:', SDK.browser.os());

// Устройства
console.log('Cameras:', SDK.browser.getCameras());
console.log('Microphones:', SDK.browser.getMicrophones());

// Разрешения
console.log('Camera permission:', SDK.browser.hasCameraPermission());
console.log('Mic permission:', SDK.browser.hasMicrophonePermission());

// Версия SDK
console.log('SDK version:', SDK.version());