Log() method and LOG macro

The logrr::Log() method writes to the log.

Method parameters:

The logrr::Log() method is intended for use in C++ programs. In C-language programs, use the static function ClogLog() or CLOG macro.

A description of the logrr::Log() method and macros for quick access to it are provided in the file /opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/component/logrr/cpp/logger.h.

component/logrr/cpp/logger.h (fragment)

namespace logrr {

namespace details {

__rtl_public

void PrintErrorMessage(std::string_view fileName, std::uint32_t line, std::string_view exMsg) noexcept;

} // namespace details

__rtl_public

void Init(std::string_view providerName) noexcept;

__rtl_public

bool ShouldLog(logrr::LogLevel logLevel) noexcept;

__rtl_public

void SendMessage(

std::string_view module,

LogLevel logLevel,

std::string_view file,

const uint32_t line,

std::string_view function,

std::string_view msg) noexcept;

template <typename... Args>

__rtl_public

void Log(

logrr::LogLevel logLevel,

kos::rtl::SourceLocation sourceLocation,

std::string_view format,

Args&&... args) noexcept

{

Log(logLevel, sourceLocation.file_name(), sourceLocation.line(),

sourceLocation.function_name(), format, std::forward<Args>(args)...);

}

template <typename... Args>

__rtl_public

void Log(

std::string_view module,

logrr::LogLevel logLevel,

kos::rtl::SourceLocation sourceLocation,

std::string_view format,

Args&&... args) noexcept

{

Log(module, logLevel, sourceLocation.file_name(), sourceLocation.line(),

sourceLocation.function_name(), format, std::forward<Args>(args)...);

}

template <typename... Args>

__rtl_public

void Log(

logrr::LogLevel logLevel,

std::string_view file,

const uint32_t line,

std::string_view function,

std::string_view format,

Args&&... args) noexcept

{

Log("", logLevel, file, line, function, format, std::forward<Args>(args)...);

}

template <typename... Args>

__rtl_public

void Log(

std::string_view module,

logrr::LogLevel logLevel,

std::string_view file,

const uint32_t line,

std::string_view function,

std::string_view format,

Args&&... args) noexcept

{

if (ShouldLog(logLevel))

try

{

constexpr auto MaxLength = static_cast<std::size_t>(LOGRR_LOG_MESSAGE_MAX_SIZE - 1);

if constexpr (!sizeof...(args))

{

SendMessage(module, logLevel, file, line, function, format.substr(0, MaxLength));

}

else

{

std::array<std::uint8_t, MaxLength> fmtBuf;

const auto endIt{fmt::format_to_n(

fmtBuf.begin(),

MaxLength,

format,

std::forward<Args>(args)...).out};

const std::string_view formattedStr{

reinterpret_cast<const char*>(fmtBuf.data()),

static_cast<std::size_t>(std::distance(fmtBuf.begin(), endIt))};

SendMessage(module, logLevel, file, line, function, formattedStr);

}

}

catch (const std::exception& e)

{

details::PrintErrorMessage(file, line, e.what());

}

}

} // namespace logrr

namespace {

const std::string_view LOG_MODULE;

} // namespace

#define __CPPLOG_LEVEL_TRACE__ logrr::LogLevel::Trace

#define __CPPLOG_LEVEL_DEBUG__ logrr::LogLevel::Debug

#define __CPPLOG_LEVEL_INFO__ logrr::LogLevel::Info

#define __CPPLOG_LEVEL_WARNING__ logrr::LogLevel::Warning

#define __CPPLOG_LEVEL_ERROR__ logrr::LogLevel::Error

#define __CPPLOG_LEVEL_CRITICAL__ logrr::LogLevel::Critical

#define LOG_INIT(providerName) \

logrr::Init(providerName)

#define CALL_LOG(level, ...) \

logrr::Log(LOG_MODULE, level, kos::rtl::SourceLocation::current(), __VA_ARGS__)

#define CALL_LOG_SL(level, file, line, func, ...) \

logrr::Log(LOG_MODULE, level, file, line, func, __VA_ARGS__)

#define LOG(level, ...) CALL_LOG(__CPPLOG_LEVEL_ ## level ## __, __VA_ARGS__)

#define LOG_SL(level, file, line, func, ...) CALL_LOG_SL(__CPPLOG_LEVEL_ ## level ## __, file, line, func, __VA_ARGS__)

A macro for quick access to the Log() method

Instead of calling the static method Logger::Log(), you can use the macro whose description is provided in the file component/logrr/cpp/logger.h. This macro is variadic (takes a variable number of parameters), which lets you avoid specifying all parameters of the Logger::Log() method. When calling this macro, you only need to specify the log level and message formatting string with the values of parameters. The applied log level logLevel is determined by the first parameter of the macro: An example of using these macros is provided in the section titled Using macros to send messages to a log.

Page top