Дополнительные возможности при отправке сообщений в журнал
В большинстве случаев, для отправки сообщений в журнал достаточно использовать макросы быстрого доступа к функциям журналирования.
В этом разделе описаны дополнительные возможности API библиотеки logrr_cpp
: объединение сообщений, отправка сообщений по условию и отложенная отправка.
Объединение сообщений
Чтобы поэтапно получить текст записи журнала из частей и затем отправить запись в журнал одним вызовом:
- Скомпонуйте программу с библиотекой logrr_cpp.
- Подключите заголовочный файл
component/logrr/cpp/tools.h
.C++
- Создайте экземпляр класса
LogIface
.C++
auto logger = LogIface(logrr::LogLevel::Warning); - Заполните буфер сообщений одним или несколькими вызовами метода
LogIface::Push()
.C++
logger.Push("a={}", a); // ... logger.Push(", b={}", b); // ... logger.Push(", c={}", c); - Отправьте ранее полученные сообщения в журнал с помощью метода
LogIface::Flush()
.C++
logger.Flush();
Отправка сообщения в журнал по условию
Чтобы отправить сообщение в журнал только при выполнении указанного условия:
- Скомпонуйте программу с библиотекой logrr_cpp.
- Подключите заголовочный файл
component/logrr/cpp/tools.h
.C++
- Передайте логическое значение, один из перечислителей
LogLevel
и текст сообщения в макросLOG_IF()
.C++
LOG_IF(IsWorldBroken(), logrr::LogLevel::Critical, "World is broken!");
Отложенная отправка сообщений в журнал
Макрос LOG_DEFER()
, объявленный в заголовочном файле component/logrr/cpp/tools.h
, позволяет избежать дублирования кода для журналирования в блоках if
...else
.
Чтобы отправить предварительно отформатированное сообщение в журнал в момент выхода из функции:
- Скомпонуйте программу с библиотекой logrr_cpp.
- Подключите заголовочный файл
component/logrr/cpp/tools.h
.C++
- Добавьте вызов макроса
LOG_DEFER()
в начало кода функции, изменяющей значения, которые нужно отправить в журнал. В макрос передайте значениеLogLevel
, строку форматирования сообщения и аргументы для подстановки в строку форматирования.C++
int DeferredLoggingExample() { auto logger = LOG_DEFER(logrr::LogLevel::Info, "a={}, b={}", a, b); if (someCondition) { a = 1; b = 2; return -1; } else { a = 3; b = 4; return 0; } }
В этом примере, сообщение отправляется в журнал при вызове деструктора объекта logger
на выходе из функции DeferredLoggingExample()
. В строку форматирования сообщения подставляются значения a
и b
, актуальные на момент выхода из функции.