Содержание
Компонент LogRR
Компонент LogRR
– система для журналирования информации о работе программ. Компонент включает в себя программу-сервер, которому другие программы передают сообщения о своем состоянии, и вспомогательные каналы вывода для журналирования. Для отправки сообщений серверу прикладные программы используют библиотеку logrr_clog
(для C++ доступна библиотека logrr_cpp
), которая фильтрует сообщения по уровню журналирования и отправляет их серверу. Сервер передаёт сообщения каналам вывода. Канал вывода сохраняет сообщения журнала в файлы.
В SDK API программы LogRR представлены статическими и динамическими библиотеками, компонуемыми с программами, информация о работе которых журналируется:
- в программах на языке C используется библиотека
logrr_clog
и заголовочный файлsysroot-*-kos/include/component/logrr/clog/clog.h
. - в программах на языке С++ используется библиотека
logrr_cpp
и заголовочный файлsysroot-*-kos/include/component/logrr/cpp/logger.h
.
Добавление сервера журналирования и каналов вывода в решение
Программа LogrrServer
отправляет сообщения одному или нескольким каналам вывода. Вы можете записывать сообщения журнала в файлы, используя канал вывода FsOutputChannel
.
Добавление и настройка сервера журналирования
Команда создания и настройки сервера журналирования create_logrr_server()
может содержать следующие параметры:
LOG_LEVEL
- Устанавливает указанный уровень журналирования. Доступные значения
LOG_LEVEL
:CRITICAL
,ERROR
,WARNING
,INFO
,DEBUG
иTRACE
. По умолчанию, сервер журналирования обрабатывает сообщения с уровнем Info. CONFIG_PATH
- Указывает путь до конфигурационного файла сервера журналирования.
RECV_CORE_LOGS
- Включает сбор журналов ядра.
WRITE_TO_CORE
- Включает передачу журналов в ядро. Не исключает передачу журналов серверу журналирование и далее в канал вывода. Требуется для вывода журналов в UART.
OUTPUT_CHANNELS
- Подключает один или несколько указанных каналов вывода к серверу.
DENY_DYNAMIC_CONN_TYPES
- Включает отклонение динамических подключений к серверу журналирования.
DENY_STATIC_CONN_TYPES
- Включает отклонение статических подключений к серверу журналирования.
Чтобы добавить программу LogrrServer
в решение,
отредактируйте корневой файл с CMake-командами сборки решения или файл с CMake-командами сборки инициализирующей программы Einit
:
CMakeLists.txt
Опцию PACK_DEPS
требуется включить при вызове команды build_kos_qemu_image()
или build_kos_hw_image()
для включения автоматической сборки библиотек в образ диска.
Добавление и настройка каналов вывода
Команда создания и настройки канала вывода журналов в файлы create_logrr_fs_output_channel()
может содержать следующие параметры:
CONFIG_PATH
- Указывает путь до конфигурационного файла канала вывода.
SERVER_TARGET
- Указывает сервер журналирования, к которому требуется подключить создаваемый канал вывода.
APP_LOG_DIR
- Указывает директорию хранения файлов журналов для программ. Обязательный параметр.
SYS_LOG_DIR
- Указывает директорию хранения файлов журналов системы. Если параметр не задан, файлы журналов системы не сохраняются.
Чтобы добавить канал вывода FsOutputChannel
в решение,
отредактируйте корневой файл с CMake-командами сборки решения или файл с CMake-командами сборки инициализирующей программы Einit
:
CMakeLists.txt
Создание IPC-каналов и разрешение взаимодействия программ
Система сборки обеспечивает автоматическое создание IPC-каналов, необходимых для работы системы журналирования, а также генерирует описание политики безопасности в части, которая разрешает взаимодействие между процессами.
Для создания статического подключения к серверу журналирования, вы можете использовать CMake-команду connect_to_logrr_server (ENTITIES <имена_программ_для_подключения>)
.
Получение записей журнала при работе в QEMU
Клиентские библиотеки logrr_clog
и logrr_cpp
отправляют сообщения в ядру, которое пересылает их в UART-порт. Вы можете перенаправить данные из эмулируемого UART-порта в стандартный поток ввода-вывода, указав флаг -serial stdio
при запуске QEMU. При этом сообщения журнала будут отображаться в терминале, в котором запущен QEMU.
Укажите флаги запуска QEMU в значении параметра QEMU_FLAGS, передаваемого команде build_kos_qemu_image():
CMakeLists.txt
Отправка сообщений в журнал с помощью макросов
Программа LogRR
предоставляет макросы для быстрого доступа к функциям журналирования с определенным уровнем.
Пример использования макросов в программе на языке C:
C
Для использования этих макросов требуется скомпоновать программу с библиотекой logrr_clog.
Пример использования макросов в программе на языке C++:
C++
Для использования этих макросов требуется скомпоновать программу с библиотекой logrr_cpp.
Дополнительные возможности при отправке сообщений в журнал
В большинстве случаев, для отправки сообщений в журнал достаточно использовать макросы быстрого доступа к функциям журналирования.
В этом разделе описаны дополнительные возможности 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
, актуальные на момент выхода из функции.
Уровни журналирования
Атрибутом каждого сообщения в системе журналирования является уровень журналирования. Уровень используется при фильтрации сообщений в клиенте и настраивается через сервер.
- Critical
- Критический сбой в работе программы, после которого продолжение работы программы невозможно.
- Error
- Ошибка в работе программы, после которой все еще возможно продолжение работы. Этот уровень применяется для журналирования неожиданного завершения текущей операции. Не рекомендуется применять для журналирования ошибочных действий пользователя.
- Warning
- Проблемная ситуация, возникновение которой предусмотрено, и обрабатывается программой в обычном режиме.
- Info (установлен по умолчанию)
- Информация о текущем функционировании программы, без дополнительных подробностей. Например, переход в новое окно в пользовательском интерфейсе или успешная запись данных в базу.
- Debug
- Более подробный уровень журналирования, чем Info. Предоставляет больше деталей о событиях программы и может быть полезен при отладке.
- Trace
- Самый подробный уровень журналирования, используемый для наиболее детального отслеживания событий программы. При включении может значительно влиять на производительность.
Каждый последующий уровень включает в себя все предыдущие. Например, если сервер настроен на уровень Warning, то в журнал передаются сообщения с уровнями Critical, Error и Warning, а сообщения с уровнями Info, Debug и Trace игнорируются.
Установка уровня журналирования при отправке сообщения программой может осуществляться:
- использованием макроса с параметром, соответствующем выбранному уровню;
- передачей значения перечислителя
LogrrLogLevel
илиLogLevel
при вызове функций журналирования.
API программы LogRR
Библиотеки программы LogRR
, предоставляют API для отправки сообщений в журнал через сервер журналирования, а также API для управления работой сервера журналирования.
Библиотека logrr_clog
Библиотека logrr_clog
предоставляет API для отправки сообщений в журнал.
Библиотека logrr_clog
предназначена для использования в программах на языке C. В программах на языке C++ используйте библиотеку logrr_cpp
.
Чтобы получить доступ к API этой библиотеки,
скомпонуйте вашу программу с библиотекой, используя CMake-команду target_link_libraries()
.
CMakeLists.txt
Функция ClogLog() и макрос CLOG
Функция ClogLog()
выполняет запись в журнал.
Функция ClogLog()
предназначена для использования в программах на языке C. В программах на языке C++ используйте функцию Logger::Log() или макросы LOG_*.
Описание функции ClogLog()
и макросов для быстрого доступа к ней представлено в файле /opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/component/logrr/clog/clog.h
.
component/logrr/clog/clog.h (фрагмент)
Параметры функции ClogLog()
:
level
- Уровень журналирования
LogrrLogLevel
. file
- Имя файла.
line
- Номер строки в файле.
func
- Имя функции.
message
- Текст сообщения или строка форматирования текста сообщения.
...
- Параметры для подстановки в строку форматирования
message
.
Макрос быстрого доступа к функции ClogLog()
Вместо вызова функции ClogLog()
вы можете использовать макрос, описание которого представлено в файле component/logrr/clog/clog.h
. Этот макрос является вариационным (принимает переменное число параметров), что позволяет не указывать все параметры функции ClogLog()
. При вызове макроса достаточно указать уровень журналирования и текст сообщения или строку форматирования сообщения со значениями параметров. Используемый уровень журналирования level
определяется первым параметром макроса. Пример использования этого макроса представлен в разделе "Отправка сообщений в журнал с помощью макросов".
Перечисляемый тип LogrrLogLevel
Перечисляемый тип LogrrLogLevel
содержит поля, имена которых соответствуют уровням журналирования, доступным в программе LogRR
.
Перечисляемый тип LogrrLogLevel
предназначен для использования в программах на языке C. В программах на языке C++ используйте класс LogLevel
.
Перечислители LogrrLogLevel
могут передаваться в функцию ClogLog()
для отправки сообщения с указанным уровнем.
Описание перечисления LogrrLogLevel
представлено в файле /opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/component/logrr/core/log_level_c.h
.
component/logrr/core/log_level_c.h (фрагмент)
Библиотека logrr_cpp
Библиотека logrr_cpp
предоставляет API для отправки сообщений в журнал.
Библиотека logrr_cpp
предназначена для использования в программах на языке C++. В программах на языке C используйте библиотеку logrr_clog
.
Чтобы получить доступ к API этой библиотеки,
скомпонуйте вашу программу с библиотекой, используя CMake-команду target_link_libraries()
.
CMakeLists.txt
Метод Log() и макрос LOG
Метод 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 (фрагмент)
Макрос быстрого доступа к методу Log()
Вместо вызова статического метода Logger::Log()
вы можете использовать макрос, описание которого представлено в файле component/logrr/cpp/logger.h
. Этот макрос является вариационным (принимает переменное число параметров), что позволяет не указывать все параметры метода Logger::Log()
. При вызове макроса достаточно указать только уровень журналирования и строку форматирования сообщения со значениями параметров. Используемый уровень журналирования logLevel
определяется первым параметром макроса: Пример использования этого макросов представлен в разделе "Отправка сообщений в журнал с помощью макросов".
Класс LogLevel
Класс LogLevel
является перечислением (enum class
) и содержит поля, имена которых соответствуют уровням журналирования, доступным в программе LogRR
.
Класс LogLevel
предназначен для использования в программах на языке C++. В программах на языке C используйте перечисляемый тип LogrrLogLevel
.
Значения перечисления LogLevel
могут передаваться в:
- статический метод
Log()
классаLogger
; - статические методы
ChangeLogLevel()
иChangeGlobalLogLevel()
структурыController
; - конструктор класса
LogIface
;
Описание класса LogLevel
представлено в файле /opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/component/logrr/core/log_level.h
.
component/logrr/core/log_level.h (фрагмент)
Класс LogIface
Класс LogIface
содержит методы, позволяющие поэтапно получить текст записи журнала из частей, и затем отправить запись в журнал одним вызовом:
- Для установки уровня журналирования отправляемых сообщений используется метод
SetLogLevel()
. - Для добавления текста к сообщению используется метод
Push()
. - Для отправки составленного одним или несколькими вызовами метода
Push()
сообщения в журнал используется методFlush()
.При вызове деструктора
~LogIface()
в журнал также отправляется составленное вызовамиPush()
сообщение, если оно не было ранее отправлено с помощьюFlush()
. - Для немедленной отправки отдельного сообщения (без использования составленного вызовами
Push()
текста) используется методLog()
.
Чтобы создать экземпляр класса LogIface
, передайте один из перечислителей LogLevel
в конструктор класса. Пример использования функций класса LogIface
представлен в подразделе "Объединение сообщений" раздела "Дополнительные возможности при отправке сообщений в журнал".
Описание класса LogIface
представлено в файле /opt/KasperskyOS-Community-Edition-<version>/sysroot-*-kos/include/component/logrr/cpp/tools.h
.
component/logrr/cpp/tools.h (фрагмент)