| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
### Добавлен троттлинг логов для предотвращения флуда
**Основная цель:** Защита от переполнения логов повторяющимися сообщениями.
#### Что добавлено:
1. **Механизм троттлинга логов** ([`common/util/logger.h`](common/util/logger.h), [`common/util/logger.cpp`](common/util/logger.cpp))
- Ограничение: по умолчанию максимум 20 сообщений за 10 секунд для каждой точки логирования
- Независимый троттлинг для каждого места вызова `YLOG` (через `static` переменную состояния)
- Подсчёт пропущенных сообщений с выводом в формате `[+N suppressed]`
- Минимальные накладные расходы: использует `GetCycleCount()` вместо системных вызовов времени
- Атомарные операции для потокобезопасности
2. **Настраиваемый троттлинг**
- Макрос `YLOG_THROTTLED(logger, priority, maxLogs, intervalSec, ...)` для кастомных лимитов
- Макросы `YLOG_THROTTLE_MAX_LOGS` и `YLOG_THROTTLE_INTERVAL_SECS` для глобальной настройки (например, в тестах)
3. **Поддержка C++20 `std::format`**
- Макросы `YLOG_*` теперь поддерживают форматирование в стиле C++20: `YLOG_ERR("value: {}", x)`
- Обратная совместимость с `YLOG_*_F` макросами сохранена
- Специальная обработка `TStringBuilder` для избежания проблем с временными объектами
4. **Тесты** ([`tests/gtests/logger_tests/`](tests/gtests/logger_tests/))
- Проверка базового троттлинга
- Проверка счётчика пропущенных сообщений
- Проверка независимости троттлинга для разных точек логирования
- Проверка форматирования сообщений
#### Технические изменения:
**Изменён порядок аргументов в макросе `YLOG`:**
- Было: `YLOG(priority, message, logger)`
- Стало: `YLOG(logger, priority, message, ...)`
Это изменение потребовало обновления всех вызовов `YLOG` в кодовой базе (~30 файлов), но обеспечивает:
- Единообразие с другими логирующими библиотеками
- Возможность использования variadic arguments для форматирования
- Правильную работу с `const auto&` для продления времени жизни временных объектов
#### Примеры использования:
```cpp
// Базовое использование (троттлинг 20 логов/10 сек)
YLOG_ERR("Error occurred");
YLOG_INFO("Processing item: {}", itemId);
```
#### Влияние на производительность:
- Минимальные накладные расходы: ~10-20 наносекунд на вызов (использование CPU cycles вместо системного времени)
- Атомарные операции только при необходимости логирования
- Отсутствие дополнительных (по сравнению с текущим кодом) аллокаций памяти в hot path
#### Обратная совместимость:
- Все существующие `YLOG_*` и `YLOG_*_F` макросы работают как раньше
- Добавлен троттлинг по умолчанию для всех логов (может потребовать внимания при отладке)
commit_hash:d6e98b82486b99b945a1ba264fb2da969db4fcfc
|