SVET/docs/ru/interfaces/logger.md

8.3 KiB
Raw Blame History

Logger

Введение

Логирование неотъемлимая часть в создании и отладке программ, соответственно проект SVET старается сделать этот процесс наиболее дружелюбным для программистов. Класс Logger представляет из себя интерфейс взаимодействия с конечным пользователем посредством Serial порта используя переферийное ядро как показано на диаграмме.

Important

Для использования логгера рекомендуется не обращаться к классу Logger напрямую. Для логирования в своих проектах используйте адаптер ServiceLogger

Logger IO Arch

Можно заметить что все сервисы внутри ядра SVET передают в логгер информацию для удобства отладки и программирования. Это поведение можно настроить(например отключить логи ядра полностью) при создании класса SVET с помощью SVETBuilder. Так же, можно заметить что логгер находится за пределами ядра и является интерфейсом взаимодействия с пользователем. Это означает что его можно использовать для своих собственных целей даже если логирование самого ядра отключено. Для этого у класса Logger есть публичные методы для логирования.

Публичные методы:

Info

void Info(char* data, char* initiator = nullptr);

Метод для логирования информации.

Где data - строка с сообщением которое нужно отобразить

Где initiator - строка которая отображает от кого поступил лог

Пример отображения в Serial мониторе:

[INFO] Core: Core never changes //Сообщение от ядра
[INFO]: Hello world! //Если initiator не передан
[INFO] main.cpp: Hello world! //Если initiator передан и не равен nullptr

Warn

void Warn(char* data, char* initiator = nullptr);

Метод для логирования информации требующей внимания.

Где data - строка с сообщением которое нужно отобразить

Где initiator - строка которая отображает от кого поступил лог

Пример отображения в Serial мониторе:

[WARN] Core: Core will changed... //Сообщение от ядра
[WARN]: Hello warn! //Если initiator не передан
[WARN] main.cpp: Hello world! //Если initiator передан и не равен nullptr

Error

void Error(char* data, char* initiator = nullptr);

Метод для логирования информации об ошибке.

Где data - строка с ошибкой которую нужно отобразить

Где initiator - строка которая отображает от кого поступил лог

Пример отображения в Serial мониторе:

[ERROR] Core: Core changed!!! //Сообщение от ядра
[ERROR]: Exception! //Если initiator не передан
[ERROR] main.cpp: Hello world! //Если initiator передан и не равен nullptr

Создание Logger

Создание экземпляра Logger происходит в методе SVET::Start используя параметры указанные через LoggerOptions в методе SVETBuilder::SetLogger. Вам обязательно необходимо установить параметры логгирования, в противном случае проект не будет скомпилирован.

Пример получения Logger

std::unique_ptr<SVET> svet;
Logger *logger;
void setup()
{
  auto builder = SVETBuilder::Setup()->SetLogger(LoggerOptions()); //Установка параметров логгера
  svet = std::make_unique<SVET>(SVET(builder));
  svet->Start();
  logger = svet->SLogger.get();
}

В данном случае будут использованы параметры по умолчанию указанные в конструкторе LoggerOptions

Установка своих параметров

Конструктор LoggerOptions принимает в себя следующие параметры:

MessageType coreLoggerLevel,
MessageType userLoggerLevel,
bool useColor,
short baudRate

Где

coreLoggerLevel - указание уровня с которого будет производится логирование сообщений ядра

userLoggerLevel - указание уровня с которого будет производится логирование сообщений разработчика

useColor - указание вывода цветных сообщений (отправка ESCAPE последовательностей для цвета)

baudRate - указание скорости работы Serial порта

В свою очередь MessageType является enum с следующими значениями:

INFO, - Вывод сообщений через методы Info, Warn, Error
WARN, - Вывод сообщений через методы Warn, Error
ERROR, - Вывод сообщений только через метод Error
NONE - Отсутствие вывода

Таким образом можно управлять выводом SVET и выводом разработчика в зависимости от ситуации.

Отключение Logger

Если вам необходимо полностью перехватить работу с классом Serial, вы можете отключить Logger и использовать Serial по своему назначению не боясь что кто-то вмешивается в его работу. Для этого необходимо установить параметры coreLoggerLevel и userLoggerLevel в значения NONE. В этом случае Logger не будет выполнять комманду Serial.begin() и логгировать сообщения поступающие из ядра и от пользователя.

Пример:

auto builder = SVETBuilder::Setup()->SetLogger(LoggerOptions(NONE, NONE));

Время жизни Logger

Экземпляр класса Logger существует внутри обьекта SVET в качестве поля SLogger (SvetLogger или ServiceLogger). Вам не нужно создавать Logger самостоятельно если вы планируете использовать платформу SVET.

Logger является Singleton сервисом. Это сделано для того чтобы избежать излишнего расходования ресурсов микроконтроллера и не загружать его "кучу". Экземпляр SLogger существует с момента выхода из метода SVET::Start до удаления объекта SVET (по сути при правильном использовании SVET можно считать что SLogger существует до конца выполнения программы).