#pragma once #include #include "export.hpp" #include "log_level.hpp" #include "result.hpp" namespace logger { /** * @brief Класс для ведения журналов (логирования) в файл. * * Logger предоставляет интерфейс для записи сообщений с различными * уровнями важности. * * Объект Logger владеет своим ресурсом и не может быть скопирован или * перемещён, чтобы исключить неоднозначность владения журналом. * * Методы with* используют неизменяемый подход: * они создают новый экземпляр Logger с изменённой конфигурацией. */ class LOGGER_API Logger { public: /** * @brief Создаёт объект логгера. * * @param fileName Имя файла, в который будут записываться сообщения. * @param defaultLevel Уровень логирования по умолчанию. */ Logger(const std::string &fileName, LogLevel defaultLevel); /** * @brief Освобождает ресурсы, используемые логгером. */ ~Logger(); /** * @brief Запрещает создание копии Logger. * * Logger управляет уникальным ресурсом и не может иметь * несколько владельцев. */ Logger(const Logger &) = delete; /** * @brief Запрещает копирующее присваивание. */ Logger &operator=(const Logger &) = delete; /** * @brief Запрещает перемещение Logger. */ Logger(Logger &&) = delete; /** * @brief Запрещает перемещающее присваивание. */ Logger &operator=(Logger &&) = delete; /** * @brief Записывает сообщение в журнал с указанным уровнем логирования. * * В случае успешной записи возвращается успешный Status. * При ошибке открытия файла или записи возвращается Status * с описанием ошибки. * * @warning Класс Logger не является потокобезопасным. * Одновременный вызов данного метода из нескольких потоков * для одного и того же экземпляра Logger или одного файла журнала * может привести к неопределённому порядку записей. * * @param level Уровень логирования сообщения. * @param message Текст сообщения. * * @return Статус выполнения операции. */ core::Status writeMessage(LogLevel level, const std::string &message); /** * @brief Записывает сообщение в журнал с уровнем логирования по умолчанию. * * Метод является удобной перегрузкой и эквивалентен вызову: * * @code * writeMessage(getLogLevel(), message); * @endcode * * @warning Класс Logger не является потокобезопасным. * Одновременный вызов данного метода из нескольких потоков * для одного и того же экземпляра Logger или одного файла журнала * может привести к неопределённому порядку записей. * * @param message Текст сообщения. * * @return Статус выполнения операции. */ core::Status writeMessage(const std::string &message); /** * @brief Создаёт новый Logger с изменённым уровнем логирования. * * Текущий объект не изменяется. * * @param level Новый уровень логирования. * * @return Новый объект Logger. */ Logger withLogLevel(LogLevel level) const; /** * @brief Создаёт новый Logger с изменённым именем файла. * * Текущий объект не изменяется. * * @param fileName Новое имя файла журнала. * * @return Новый объект Logger. */ Logger withFileName(const std::string &fileName) const; /** * @brief Возвращает текущий уровень логирования. * * @return Уровень логирования по умолчанию. */ LogLevel getLogLevel() const; /** * @brief Возвращает имя файла журнала. * * @return Имя файла журнала. */ const std::string &getFileName() const; private: /** * @brief Имя файла журнала. */ std::string fileName_; /** * @brief Создаёт объект логгера. * * @param fileName Имя файла, в который будут записываться сообщения. * @param defaultLevel Уровень логирования по умолчанию и минимальный уровень * важности сообщений, которые будут записываться в * журнал. */ LogLevel defaultLevel_; }; } // namespace logger