Метод logrr::Log()
выполняет запись в журнал.
Параметры метода:
logLevel
Уровень журналирования LogLevel
.
sourceLocation
Объект, определяющий местоположение в исходном коде (имя файла, имя функции, номер строки и номер столбца). В C++20 используется класс std::source_location
, в более ранних версиях используется класс std::experimental::source_location
.
format
Строка форматирования текста сообщения.
args
Параметры для подстановки в строку форматирования format
.
Метод logrr::Log()
предназначен для использования в программах на языке C++. В программах на языке C используйте статическую функцию ClogLog() или макрос CLOG.
Описание метода logrr::Log()
и макроса быстрого доступа к нему представлены в файле /opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/component/logrr/cpp/logger.h
.
component/logrr/cpp/logger.h (фрагмент)
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__)
Макрос быстрого доступа к методу Log()
Вместо вызова статического метода Logger::Log()
вы можете использовать макрос, описание которого представлено в файле component/logrr/cpp/logger.h
. Этот макрос является вариационным (принимает переменное число параметров), что позволяет не указывать все параметры метода Logger::Log()
. При вызове макроса достаточно указать только уровень журналирования и строку форматирования сообщения со значениями параметров. Используемый уровень журналирования logLevel
определяется первым параметром макроса: Пример использования этого макросов представлен в разделе "Отправка сообщений в журнал с помощью макросов".