feat(logger): add background logger worker
This commit is contained in:
@@ -0,0 +1,89 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
|
#include <thread>
|
||||||
|
|
||||||
|
#include "logger.hpp"
|
||||||
|
#include "message_queue.hpp"
|
||||||
|
|
||||||
|
namespace app {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Фоновый поток записи сообщений в журнал.
|
||||||
|
*
|
||||||
|
* LoggerWorker получает сообщения из MessageQueue и передаёт их
|
||||||
|
* в библиотеку Logger для записи в файл.
|
||||||
|
*
|
||||||
|
* Объект Logger используется только внутри рабочего потока,
|
||||||
|
* поэтому потокобезопасность Logger не требуется.
|
||||||
|
*/
|
||||||
|
class LoggerWorker {
|
||||||
|
public:
|
||||||
|
/**
|
||||||
|
* @brief Создаёт worker для записи сообщений.
|
||||||
|
*
|
||||||
|
* @param logger Логгер, используемый для записи.
|
||||||
|
* @param queue Очередь сообщений.
|
||||||
|
*/
|
||||||
|
LoggerWorker(logger::Logger &logger, MessageQueue &queue);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Останавливает поток записи.
|
||||||
|
*
|
||||||
|
* Дожидается завершения рабочего потока.
|
||||||
|
*/
|
||||||
|
~LoggerWorker();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Запрещает копирование worker.
|
||||||
|
*/
|
||||||
|
LoggerWorker(const LoggerWorker &) = delete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Запрещает копирующее присваивание.
|
||||||
|
*/
|
||||||
|
LoggerWorker &operator=(const LoggerWorker &) = delete;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Запускает поток записи сообщений.
|
||||||
|
*/
|
||||||
|
void start();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Отправляет сигнал завершения потоку записи.
|
||||||
|
*
|
||||||
|
* После обработки всех сообщений worker завершит работу.
|
||||||
|
*/
|
||||||
|
void stop();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* @brief Основной цикл рабочего потока.
|
||||||
|
*/
|
||||||
|
void process();
|
||||||
|
|
||||||
|
private:
|
||||||
|
/**
|
||||||
|
* @brief Логгер для записи сообщений.
|
||||||
|
*
|
||||||
|
* Используется только рабочим потоком.
|
||||||
|
*/
|
||||||
|
logger::Logger &logger_;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Очередь входящих сообщений.
|
||||||
|
*/
|
||||||
|
MessageQueue &queue_;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Поток записи.
|
||||||
|
*/
|
||||||
|
std::thread workerThread_;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Флаг работы потока.
|
||||||
|
*/
|
||||||
|
std::atomic<bool> running_{false};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // namespace app
|
||||||
Reference in New Issue
Block a user