#pragma once #include #include "logger.hpp" #include "message_queue.hpp" namespace app { /** * @brief Фоновый поток записи сообщений в журнал. * * LoggerWorker получает сообщения из MessageQueue и передаёт их * в библиотеку Logger для записи в файл. * * Logger передаётся в worker по значению и перемещается внутрь объекта. * LoggerWorker становится владельцем логгера. * * Объект Logger используется только внутри рабочего потока, * поэтому потокобезопасность Logger не требуется. */ class LoggerWorker { public: /** * @brief Создаёт worker для записи сообщений. * * Переданный Logger перемещается внутрь объекта LoggerWorker. * * @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 Разрешает перемещение worker. * * Передаёт владение потоком записи и состоянием объекта. */ LoggerWorker(LoggerWorker &&) noexcept = default; /** * @brief Разрешает перемещающее присваивание worker. */ LoggerWorker &operator=(LoggerWorker &&) noexcept = default; /** * @brief Запускает поток записи сообщений. */ void start(); /** * @brief Возвращает используемый логгер. * * Позволяет получить текущую конфигурацию логгера, * например имя файла журнала или уровень логирования * по умолчанию. * * @return Константная ссылка на логгер. */ [[nodiscard]] const logger::Logger &getLogger() const; /** * @brief Устанавливает новый логгер. * * Новый Logger заменяет текущий. * Переданный объект перемещается внутрь worker. * * @param logger Новый логгер. */ void setLogger(logger::Logger logger); /** * @brief Останавливает обработку сообщений. * * После остановки очереди новые сообщения не принимаются. * Рабочий поток завершится после обработки всех сообщений, * которые уже находились в очереди. */ void stop(); private: /** * @brief Основной цикл рабочего потока. */ void process(); private: /** * @brief Логгер для записи сообщений. * * Используется только рабочим потоком. */ logger::Logger logger_; /** * @brief Очередь входящих сообщений. */ MessageQueue &queue_; /** * @brief Поток записи. */ std::thread workerThread_; }; } // namespace app