В большинстве случаев, для отправки сообщений в журнал достаточно использовать макросы быстрого доступа к функциям журналирования.
В этом разделе описаны дополнительные возможности API библиотеки logrr_cpp: объединение сообщений, отправка сообщений по условию и отложенная отправка.
Объединение сообщений
Чтобы поэтапно получить текст записи журнала из частей и затем отправить запись в журнал одним вызовом:
component/logrr/cpp/tools.h.C++
#include <component/logrr/cpp/tools.h>
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();
Отправка сообщения в журнал по условию
Чтобы отправить сообщение в журнал только при выполнении указанного условия:
component/logrr/cpp/tools.h.C++
#include <component/logrr/cpp/tools.h>
LogLevel и текст сообщения в макрос LOG_IF().C++
LOG_IF(IsWorldBroken(), logrr::LogLevel::Critical, "World is broken!");
Отложенная отправка сообщений в журнал
Макрос LOG_DEFER(), объявленный в заголовочном файле component/logrr/cpp/tools.h, позволяет избежать дублирования кода для журналирования в блоках if...else.
Чтобы отправить предварительно отформатированное сообщение в журнал в момент выхода из функции:
component/logrr/cpp/tools.h.C++
#include <component/logrr/cpp/tools.h>
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, актуальные на момент выхода из функции.