SVET/docs/ru/interfaces/logger.md

128 lines
8.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Logger
## Введение
Логирование неотъемлимая часть в создании и отладке программ, соответственно проект SVET старается сделать этот процесс наиболее дружелюбным для программистов. Класс Logger представляет из себя интерфейс взаимодействия с конечным пользователем посредством **Serial** порта используя переферийное ядро как показано на диаграмме.
>[!IMPORTANT]
>Для использования логгера рекомендуется не обращаться к классу Logger напрямую. Для логирования в своих проектах используйте адаптер [ServiceLogger](service-logger.md)
<p align="center">
<img src="https://github.com/Lisoveliy/SVET/blob/master/docs/LoggerIOArch.drawio.svg?raw=true" alt="Logger IO Arch"/>
</p>
Можно заметить что все сервисы внутри ядра **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
<hr>
### 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
<hr>
### 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``` существует до конца выполнения программы).