# AJAX Обновление Логов ## Описание Функциональность AJAX обновления логов позволяет периодически получать новые логи контейнеров без необходимости обновления всей страницы. Это особенно полезно для мониторинга логов в реальном времени с минимальной нагрузкой на сервер. ## Принцип работы 1. **Загрузка истории**: История логов загружается через WebSocket при открытии контейнера 2. **Периодические запросы**: Система отправляет AJAX запросы к API эндпоинту `/api/logs/{container_id}` с заданным интервалом 3. **Умное сравнение**: Новые логи сравниваются с уже отображенными, добавляются только новые записи 4. **Автоматическое обновление**: Счетчики логов и фильтры применяются автоматически к новым данным 5. **Управление состоянием**: AJAX обновление автоматически останавливается при смене контейнера или переключении режимов 6. **Multi-view поддержка**: В режиме multi-view обновляются логи всех выбранных контейнеров одновременно ### Преимущества: - **Полнота данных**: История логов загружается при открытии контейнера - **Реальное время**: Новые логи обновляются через AJAX - **Гибкость**: Работает как с WebSocket для истории, так и с AJAX для обновлений ## API Эндпоинты ### GET /api/logs/{container_id} Получает логи контейнера через AJAX. ### GET /api/settings Получает настройки приложения. **Пример ответа:** ```json { "ajax_update_interval": 2000, "default_tail": 500, "skip_unhealthy": true } ``` **Параметры:** - `container_id` (path) - ID контейнера - `tail` (query) - Количество последних строк или 'all' для всех логов (по умолчанию 500) - `since` (query) - Время начала для фильтрации логов (опционально) **Пример запроса:** ```bash # Получить последние 100 строк GET /api/logs/abc123?tail=100&since=2024-01-01T10:00:00Z # Получить все логи GET /api/logs/abc123?tail=all # Получить все логи с фильтрацией по времени GET /api/logs/abc123?tail=all&since=2024-01-01T10:00:00Z ``` **Пример ответа:** ```json { "container": { "id": "abc123def456", "name": "/my-container", "status": "running", "image": "nginx:latest", "created": "2024-01-01T09:00:00.000000000Z", "state": { "Status": "running", "Running": true } }, "logs": [ { "timestamp": "2024-01-01T10:30:00.123456789Z", "message": "INFO: Application started", "raw": "2024-01-01T10:30:00.123456789Z INFO: Application started" } ], "total_lines": 1, "tail": 100, "since": "2024-01-01T10:00:00Z", "timestamp": "2024-01-01T10:30:00.123456789Z" } ``` ## Интерфейс пользователя ### Чекбокс управления В секции Options добавлен чекбокс "Auto-update logs": - **Включен** - автоматическое обновление логов через AJAX - **Выключен** - отключение автоматического обновления **Примечание**: - Чекбокс включен по умолчанию - В multi-view режиме AJAX обновляет логи всех выбранных контейнеров одновременно - При включении чекбокса обновление запускается автоматически ### Настройки интервала Интервал обновления настраивается через переменную окружения: - `LOGBOARD_AJAX_UPDATE_INTERVAL` - интервал обновления в миллисекундах (по умолчанию 2000ms) **Пример настройки в .env файле:** ```bash # Обновление каждые 5 секунд LOGBOARD_AJAX_UPDATE_INTERVAL=5000 # Обновление каждую секунду LOGBOARD_AJAX_UPDATE_INTERVAL=1000 ``` ## JavaScript API ### Функции управления ```javascript // Включить AJAX обновление enableAjaxLogUpdate(intervalMs); // Отключить AJAX обновление disableAjaxLogUpdate(); // Переключить состояние toggleAjaxLogUpdate(); // Выполнить одно обновление performAjaxLogUpdate(); ``` ### Глобальные переменные ```javascript // Интервал обновления ajaxUpdateIntervalMs // Состояние активности ajaxUpdateEnabled // Состояние для каждого контейнера (для multi-view) containerStates // Map: containerId -> {lastTimestamp, lastSecondCount} ``` ## Особенности реализации ### Обработка новых логов 1. **Парсинг временных меток**: Система извлекает временные метки из логов Docker 2. **Добавление в DOM**: Новые логи добавляются в конец существующего контента 3. **Применение фильтров**: Автоматически применяются активные фильтры 4. **Обновление счетчиков**: Пересчитываются счетчики уровней логов 5. **Очистка дубликатов**: Удаляются дублированные строки ### Управление состоянием - AJAX обновление автоматически останавливается при смене контейнера - При переключении в multi-view режим обновление также останавливается - Состояние контейнеров сбрасывается при смене режимов просмотра - В multi-view режиме состояние отслеживается отдельно для каждого контейнера ### Обработка ошибок - Ошибки сети не останавливают обновление - Все ошибки логируются в консоль - При отсутствии токена авторизации обновление пропускается ## Преимущества 1. **Низкая нагрузка**: Только новые логи передаются по сети 2. **Надежность**: Простая HTTP архитектура без WebSocket сложностей 3. **Гибкость**: Настраиваемый интервал обновления 4. **Совместимость**: Работает с существующими фильтрами и счетчиками 5. **Производительность**: Минимальное влияние на производительность браузера ## Ограничения 1. **Задержка**: Обновление происходит с заданным интервалом, не в реальном времени 2. **Ограничения браузера**: Может быть ограничено политиками CORS 3. **Нагрузка на сервер**: При большом количестве контейнеров может создавать нагрузку ## Автор Сергей Антропов Сайт: https://devops.org.ru