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

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; Logger *logger; void setup() { auto builder = SVETBuilder::Setup()->SetLogger(LoggerOptions()); //Установка параметров логгера svet = std::make_unique(SVET(builder)); svet->Start(); logger = svet->SLogger.get(); } В данном случае будут использованы параметры по умолчанию указанные в конструкторе ```LoggerOptions``` ### Установка своих параметров Конструктор ```LoggerOptions``` принимает в себя следующие параметры: MessageType coreLoggerLevel, MessageType userLoggerLevel, bool useColor, short baudRate Где ```coreLoggerLevel``` - указание уровня с которого будет производится логирование сообщений ядра ```userLoggerLevel``` - указание уровня с которого будет производится логирование сообщений разработчика ```useColor``` - указание вывода цветных сообщений ```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``` существует до конца выполнения программы).