- Убраны фразы 'Connected to container: frontend-iaas' из single view - Исправлен пересчет счетчиков LogLevels с учетом параметра Tail Lines - Добавлена функция recalculateMultiViewCounters() для корректной работы счетчиков в MultiView - Счетчики теперь считают только отображаемые логи с учетом фильтров и Tail Lines - Обновлены все обработчики событий для корректного пересчета счетчиков в обоих режимах
332 lines
16 KiB
Markdown
332 lines
16 KiB
Markdown
|
||
# 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
|
||
|
||
|
||
## Скриншоты
|
||
|
||
Тёмная тема:
|
||
|
||

|
||
|
||
Светлая тема:
|
||
|
||

|