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