Files

126 lines
3.8 KiB
C++

#pragma once
#include <thread>
#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