8.3 KiB
Logger
Введение
Логирование неотъемлимая часть в создании и отладке программ, соответственно проект SVET старается сделать этот процесс наиболее дружелюбным для программистов. Класс Logger представляет из себя интерфейс взаимодействия с конечным пользователем посредством Serial порта используя переферийное ядро как показано на диаграмме.
Important
Для использования логгера рекомендуется не обращаться к классу Logger напрямую. Для логирования в своих проектах используйте адаптер ServiceLogger
Можно заметить что все сервисы внутри ядра 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
существует до конца выполнения программы).