- Радикально переработаны функции очистки пустых строк - Удалены переносы строк из HTML-шаблонов логов - Добавлены CSS стили для правильного отображения элементов .line - Увеличена частота периодической очистки до 2 секунд - Добавлена агрессивная очистка во всех ключевых точках приложения - Улучшена логика определения типа элемента для правильной очистки Автор: Сергей Антропов Сайт: https://devops.org.ru
LogBoard+
Веб-интерфейс для просмотра логов Docker контейнеров в реальном времени.
Исправления дублирования строк и правильных переносов строк в режимах Single View и MultiView
Проблема
В режимах Single View и MultiView происходило дублирование строк логов и проблемы с переносами строк между логами, что затрудняло чтение и анализ логов.
Внесенные исправления
Для режима Single View:
-
Обработка дублированных строк в WebSocket данных
- Добавлена проверка на дублирование в функции
openWs
- Используются только уникальные строки из входящих данных
- Добавлена проверка на дублирование в функции
-
Проверка дублирования при добавлении строк
- Добавлена проверка на дублирование в функции
handleLine
для Single View - Пропускаются дублированные строки перед добавлением в интерфейс
- Добавлена проверка на дублирование в функции
-
Правильные переносы строк
- Добавлены переносы строк
\n
после каждой строки лога для читаемости - Создана функция
processSingleViewSpecialReplacements()
для обработки строк - Улучшена функция
cleanSingleViewEmptyLines()
для сохранения переносов строк
- Добавлены переносы строк
-
Универсальная функция очистки
- Создана функция
cleanDuplicateLines()
для удаления последовательных дубликатов - Работает как для Single View, так и для MultiView
- Создана функция
-
Периодическая очистка
- Добавлена очистка дублированных строк при обновлении счетчиков
- Очистка выполняется при обновлении логов и фильтров
Для режима MultiView:
-
Предотвращение одновременного отображения в обычном и multi-view режимах
- Логи теперь отображаются только в одном режиме одновременно
- Добавлена проверка
!state.multiViewMode
в функцииhandleLine
-
Обработка дублированных строк в WebSocket данных
- Добавлена проверка на дублирование в функции
openMultiViewWs
- Используются только уникальные строки из входящих данных
- Добавлена проверка на дублирование в функции
-
Функция очистки дублированных строк
- Создана функция
cleanMultiViewDuplicateLines()
для удаления последовательных дубликатов - Функция вызывается при добавлении новых строк и периодически
- Создана функция
-
Улучшенная обработка специальных случаев
- Улучшена функция
processMultiViewSpecialReplacements()
для обработки строк с "FoundINFO:" - Добавлена проверка на дублирование в исходном тексте
- Улучшена функция
-
Периодическая очистка
- Добавлена периодическая очистка дублированных строк каждую секунду
- Очистка выполняется при обновлении логов и фильтров
Тестирование
Для тестирования исправлений используйте в консоли браузера:
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 (рекомендуется)
# Распаковать проект
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
для хранения всех настроек. Для настройки:
-
Автоматическая настройка:
make setup
-
Ручная настройка:
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 одновременно:
Через веб-интерфейс:
- Откройте LogBoard+ в браузере
- Используйте селектор "Projects" в верхней панели
- Выберите проект из списка или "All Projects" для всех
- Просматривайте логи контейнеров выбранного проекта
Через переменные окружения:
-
Укажите проекты в .env файле:
LOGBOARD_PROJECTS=project1,project2,project3
-
Перезапустите LogBoard+:
make restart
API эндпоинты:
GET /api/projects
- получить список всех проектовGET /api/services?projects=project1,project2
- получить контейнеры конкретных проектов
Настройка Docker сетей
Для подключения к внешним Docker сетям (например, для работы с другими проектами):
-
Укажите сети в .env файле:
DOCKER_NETWORKS=iaas,infrastructure_iaas,myproject_network
-
Сгенерируйте docker-compose.yml:
make generate
-
Убедитесь, что сети существуют:
docker network ls
-
Создайте сети, если их нет:
docker network create iaas docker network create infrastructure_iaas
Настройка прав доступа к Docker
Приложение запускается с правами root для корректного доступа к Docker socket. Если вы хотите запускать без прав root, добавьте вашего пользователя в группу docker:
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)
Классический способ
# Распаковать проект
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
:
environment:
- LB_USER=admin
- LB_PASS=admin
Интерфейс
Верхняя панель
- Тема — переключатель тёмной/светлой темы
- aggregate — собирает все реплики сервиса в одну вкладку
- group — собирает несколько сервисов в один поток логов
- snapshot — сохраняет текущие логи этой панели в файл
- tail — количество строк истории при подключении
Панель вкладок
- Вкладки по сервисам и репликам
- Клик по вкладке — открыть поток логов
- Цветной чип
[id]
— уникальная реплика, цвет закреплён - Чекбоксы под вкладками — фильтр по репликам
Логи
- Цвета в логах из ANSI-кодов
- Фильтрация по уровню (
debug
,info
,warn
,error
) - Пауза/возобновление стрима
- При выделении текста появляется кнопка "Копировать"
Fan-in группировка
Позволяет объединить несколько разных сервисов в один поток:
- Нажмите кнопку group вверху
- Введите имена сервисов через запятую (например:
api, worker, scheduler
) - Откроется панель с логами всех указанных сервисов, с префиксом
[id service]
- Можно фильтровать по конкретным репликам внизу
Советы
- Если контейнер перезапустился — поток автоматически переподключается
- Можно открыть несколько вкладок браузера с разными сервисами — всё работает параллельно
- Для больших проектов удобно держать одну панель с
aggregate
, вторую — сgroup
по критическим сервисам
Лицензия
MIT
Скриншоты
Тёмная тема:
Светлая тема: