# LogBoard+ Веб-интерфейс для просмотра логов Docker контейнеров в реальном времени. ## Исправления дублирования строк и правильных переносов строк в режимах Single View и MultiView ### Проблема В режимах Single View и MultiView происходило дублирование строк логов и проблемы с переносами строк между логами, что затрудняло чтение и анализ логов. ### Внесенные исправления #### Для режима Single View: 1. **Обработка дублированных строк в WebSocket данных** - Добавлена проверка на дублирование в функции `openWs` - Используются только уникальные строки из входящих данных 2. **Проверка дублирования при добавлении строк** - Добавлена проверка на дублирование в функции `handleLine` для Single View - Пропускаются дублированные строки перед добавлением в интерфейс 3. **Правильные переносы строк** - Добавлены переносы строк `\n` после каждой строки лога для читаемости - Создана функция `processSingleViewSpecialReplacements()` для обработки строк - Улучшена функция `cleanSingleViewEmptyLines()` для сохранения переносов строк 4. **Универсальная функция очистки** - Создана функция `cleanDuplicateLines()` для удаления последовательных дубликатов - Работает как для Single View, так и для MultiView 5. **Периодическая очистка** - Добавлена очистка дублированных строк при обновлении счетчиков - Очистка выполняется при обновлении логов и фильтров #### Для режима MultiView: 1. **Предотвращение одновременного отображения в обычном и multi-view режимах** - Логи теперь отображаются только в одном режиме одновременно - Добавлена проверка `!state.multiViewMode` в функции `handleLine` 2. **Обработка дублированных строк в WebSocket данных** - Добавлена проверка на дублирование в функции `openMultiViewWs` - Используются только уникальные строки из входящих данных 3. **Функция очистки дублированных строк** - Создана функция `cleanMultiViewDuplicateLines()` для удаления последовательных дубликатов - Функция вызывается при добавлении новых строк и периодически 4. **Улучшенная обработка специальных случаев** - Улучшена функция `processMultiViewSpecialReplacements()` для обработки строк с "FoundINFO:" - Добавлена проверка на дублирование в исходном тексте 5. **Периодическая очистка** - Добавлена периодическая очистка дублированных строк каждую секунду - Очистка выполняется при обновлении логов и фильтров ### Тестирование Для тестирования исправлений используйте в консоли браузера: ```javascript testDuplicateRemoval() // Тест функции очистки дубликатов MultiView testSingleViewDuplicateRemoval() // Тест функции очистки дубликатов Single View testSingleViewEmptyLinesRemoval() // Тест функции очистки пустых строк Single View testSingleViewLineBreaks() // Тест правильного отображения переносов строк checkMultiViewHTML() // Проверка HTML на наличие дубликатов cleanDuplicateLines() // Универсальная функция очистки дубликатов cleanSingleViewEmptyLines() // Функция очистки пустых строк ``` ### Автор Сергей Антропов Сайт: https://devops.org.ru LogBoard+ — это веб-панель для просмотра логов микросервисов из `docker-compose` в **реальном времени** с поддержкой: - Вкладок по сервисам и репликам - Темная/светлая темы - Подсветка ANSI-цветов из логов - Фильтрация по уровням (`debug`, `info`, `warn`, `error`) - Снимки логов в файл (`snapshot`) - Объединение всех реплик сервиса в одну вкладку (**aggregate**) - Fan-in группировка нескольких сервисов в одну панель (**group**) - Цветовые теги по короткому ID контейнера - Sticky-фильтры по репликам - Пауза/возобновление стрима - Basic Auth для доступа - Автопереподключение вебсокетов - Поддержка нескольких клиентов одновременно --- ## Установка и запуск ### Быстрый старт с Makefile (рекомендуется) ```bash # Распаковать проект unzip logboard_plus_fanin_groups.zip cd logboard_plus # Показать доступные команды make help # Настроить переменные окружения make setup # Отредактировать .env файл под свои нужды (опционально) # nano .env # Собрать и запустить проект make build make up # Открыть в браузере http://localhost:9001 ``` ### Команды Makefile | Команда | Описание | |---------|----------| | `make help` | Показать справку по всем командам | | `make setup` | Настроить переменные окружения (копировать env.example в .env) | | `make generate` | Сгенерировать docker-compose.yml из .env файла | | `make build` | Собрать Docker образ | | `make up` | Запустить сервисы в фоновом режиме (с правами root) | | `make down` | Остановить и удалить сервисы (с правами root) | | `make restart` | Перезапустить сервисы (с правами root) | | `make logs` | Показать логи сервисов в реальном времени | | `make logs-tail` | Показать последние 100 строк логов | | `make status` | Показать статус сервисов | | `make clean` | Остановить сервисы и удалить образы | | `make shell` | Подключиться к контейнеру | | `make dev` | Запуск в режиме разработки (с выводом логов) | | `make rebuild` | Пересобрать и запустить сервисы | ### Настройка переменных окружения Проект использует файл `.env` для хранения всех настроек. Для настройки: 1. **Автоматическая настройка:** ```bash make setup ``` 2. **Ручная настройка:** ```bash cp env.example .env nano .env # или любой другой редактор ``` #### Основные переменные окружения: | Переменная | Описание | Значение по умолчанию | |------------|----------|----------------------| | `LOGBOARD_PORT` | Порт веб-интерфейса | `9001` | | `LOGBOARD_USER` | Имя пользователя для Basic Auth | `admin` | | `LOGBOARD_PASS` | Пароль для Basic Auth | `s3cret-change-me` | | `LOGBOARD_TAIL` | Количество строк истории | `500` | | `LOGBOARD_SNAPSHOT_DIR` | Директория для снимков | `/app/snapshots` | | `LOGBOARD_INDEX_HTML` | Путь к HTML шаблону | `./templates/index.html` | | `TZ_TS` | Временная зона для меток времени | (пусто) | | `COMPOSE_PROJECT_NAME` | Фильтр по проекту Docker Compose | (пусто) | | `LOGBOARD_PROJECTS` | Множественные проекты (через запятую) | (пусто) | | `DOCKER_NETWORKS` | Внешние Docker сети (через запятую) | `iaas,infrastructure_iaas` | | `LOGBOARD_SKIP_UNHEALTHY` | Пропускать нездоровые контейнеры | `true` | | `LOGBOARD_CONTAINER_LIST_TIMEOUT` | Таймаут получения списка контейнеров (сек) | `10` | | `LOGBOARD_CONTAINER_INFO_TIMEOUT` | Таймаут получения информации о контейнере (сек) | `3` | | `LOGBOARD_HEALTH_CHECK_TIMEOUT` | Таймаут проверки health status (сек) | `2` | | `SECRET_KEY` | Секретный ключ для шифрования | `your-secret-key-here` | | `ENCRYPTION_KEY` | Ключ шифрования | `your-encryption-key-here` | **⚠️ Важно:** Измените значения `LOGBOARD_PASS`, `SECRET_KEY` и `ENCRYPTION_KEY` в продакшене! ### Работа с множественными проектами LogBoard+ поддерживает работу с несколькими проектами Docker Compose одновременно: #### Через веб-интерфейс: 1. **Откройте LogBoard+** в браузере 2. **Используйте селектор "Projects"** в верхней панели 3. **Выберите проект** из списка или "All Projects" для всех 4. **Просматривайте логи** контейнеров выбранного проекта #### Через переменные окружения: 1. **Укажите проекты в .env файле:** ```bash LOGBOARD_PROJECTS=project1,project2,project3 ``` 2. **Перезапустите LogBoard+:** ```bash make restart ``` #### API эндпоинты: - `GET /api/projects` - получить список всех проектов - `GET /api/services?projects=project1,project2` - получить контейнеры конкретных проектов ### Настройка Docker сетей Для подключения к внешним Docker сетям (например, для работы с другими проектами): 1. **Укажите сети в .env файле:** ```bash DOCKER_NETWORKS=iaas,infrastructure_iaas,myproject_network ``` 2. **Сгенерируйте docker-compose.yml:** ```bash make generate ``` 3. **Убедитесь, что сети существуют:** ```bash docker network ls ``` 4. **Создайте сети, если их нет:** ```bash docker network create iaas docker network create infrastructure_iaas ``` ### Настройка прав доступа к Docker Приложение запускается с правами root для корректного доступа к Docker socket. Если вы хотите запускать без прав root, добавьте вашего пользователя в группу docker: ```bash sudo usermod -a -G docker $USER # Перезагрузите систему или перелогиньтесь ``` ### Фильтрация контейнеров LogBoard+ автоматически пропускает контейнеры с проблемными health check для предотвращения зависания приложения. Это особенно полезно в средах с множеством контейнеров, где некоторые могут быть нездоровыми. **Настройки фильтрации:** - `LOGBOARD_SKIP_UNHEALTHY=true` - пропускать нездоровые контейнеры - `LOGBOARD_CONTAINER_LIST_TIMEOUT=10` - таймаут получения списка контейнеров - `LOGBOARD_CONTAINER_INFO_TIMEOUT=3` - таймаут получения информации о контейнере - `LOGBOARD_HEALTH_CHECK_TIMEOUT=2` - таймаут проверки health status **Логирование:** Приложение выводит в логи информацию о пропущенных контейнерах: ``` ⚠️ Пропускаем нездоровый контейнер frontend-iaas (ID: 17c539b2e4dd) ⚠️ Таймаут при получении health status для контейнера problem-container (ID: abc123def456) ``` ### Классический способ ```bash # Распаковать проект unzip logboard_plus_fanin_groups.zip cd logboard_plus # Настроить переменные окружения cp env.example .env # Отредактировать .env файл # Запуск через docker-compose docker compose up --build -d # Открыть в браузере http://localhost:9001 ``` По умолчанию логин/пароль для Basic Auth задаются в `docker-compose.yml`: ```yaml environment: - LB_USER=admin - LB_PASS=admin ``` --- ## Интерфейс ### Верхняя панель - **Тема** — переключатель тёмной/светлой темы - **aggregate** — собирает все реплики сервиса в одну вкладку - **group** — собирает несколько сервисов в один поток логов - **snapshot** — сохраняет текущие логи этой панели в файл - **tail** — количество строк истории при подключении ### Панель вкладок - Вкладки по сервисам и репликам - Клик по вкладке — открыть поток логов - Цветной чип `[id]` — уникальная реплика, цвет закреплён - Чекбоксы под вкладками — фильтр по репликам ### Логи - Цвета в логах из ANSI-кодов - Фильтрация по уровню (`debug`, `info`, `warn`, `error`) - Пауза/возобновление стрима - При выделении текста появляется кнопка "Копировать" --- ## Fan-in группировка Позволяет объединить несколько разных сервисов в один поток: 1. Нажмите кнопку **group** вверху 2. Введите имена сервисов через запятую (например: `api, worker, scheduler`) 3. Откроется панель с логами всех указанных сервисов, с префиксом `[id service]` 4. Можно фильтровать по конкретным репликам внизу --- ## Советы - Если контейнер перезапустился — поток автоматически переподключается - Можно открыть несколько вкладок браузера с разными сервисами — всё работает параллельно - Для больших проектов удобно держать одну панель с `aggregate`, вторую — с `group` по критическим сервисам --- ## Лицензия MIT ## Скриншоты Тёмная тема: ![Dark](screenshots/dark.png) Светлая тема: ![Light](screenshots/light.png)