From 3ac84cade24c7c6128691680e3b472cff10315b4 Mon Sep 17 00:00:00 2001 From: user Date: Mon, 20 Jul 2026 23:25:35 +0400 Subject: [PATCH] feat(logger): add background logger worker --- app/include/logger_worker.hpp | 89 +++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 app/include/logger_worker.hpp diff --git a/app/include/logger_worker.hpp b/app/include/logger_worker.hpp new file mode 100644 index 0000000..d29c6aa --- /dev/null +++ b/app/include/logger_worker.hpp @@ -0,0 +1,89 @@ +#pragma once + +#include +#include + +#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 running_{false}; +}; + +} // namespace app