2026-07-18 23:41:00 +04:00
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
|
|
2026-07-19 17:53:57 +04:00
|
|
|
#include "export.hpp"
|
2026-07-18 23:41:00 +04:00
|
|
|
#include "log_level.hpp"
|
|
|
|
|
#include "result.hpp"
|
|
|
|
|
|
|
|
|
|
namespace logger {
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Класс для ведения журналов (логирования) в файл.
|
|
|
|
|
*
|
|
|
|
|
* Logger предоставляет интерфейс для записи сообщений с различными
|
|
|
|
|
* уровнями важности.
|
|
|
|
|
*
|
|
|
|
|
* Объект Logger владеет своим ресурсом и не может быть скопирован или
|
|
|
|
|
* перемещён, чтобы исключить неоднозначность владения журналом.
|
|
|
|
|
*
|
|
|
|
|
* Методы with* используют неизменяемый подход:
|
|
|
|
|
* они создают новый экземпляр Logger с изменённой конфигурацией.
|
|
|
|
|
*/
|
2026-07-19 17:53:57 +04:00
|
|
|
class LOGGER_API Logger {
|
2026-07-18 23:41:00 +04:00
|
|
|
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;
|
|
|
|
|
|
|
|
|
|
/**
|
2026-07-21 15:24:00 +04:00
|
|
|
* @brief Разрешает перемещение Logger.
|
|
|
|
|
*
|
|
|
|
|
* Передаёт владение ресурсами новому объекту.
|
2026-07-18 23:41:00 +04:00
|
|
|
*/
|
2026-07-21 15:24:00 +04:00
|
|
|
Logger(Logger &&) noexcept = default;
|
2026-07-18 23:41:00 +04:00
|
|
|
|
|
|
|
|
/**
|
2026-07-21 15:24:00 +04:00
|
|
|
* @brief Разрешает перемещающее присваивание.
|
|
|
|
|
*
|
|
|
|
|
* Передаёт владение ресурсами новому объекту.
|
2026-07-18 23:41:00 +04:00
|
|
|
*/
|
2026-07-21 15:24:00 +04:00
|
|
|
Logger &operator=(Logger &&) noexcept = default;
|
2026-07-18 23:41:00 +04:00
|
|
|
|
|
|
|
|
/**
|
2026-07-19 16:48:54 +04:00
|
|
|
* @brief Записывает сообщение в журнал с указанным уровнем логирования.
|
2026-07-18 23:41:00 +04:00
|
|
|
*
|
|
|
|
|
* В случае успешной записи возвращается успешный Status.
|
|
|
|
|
* При ошибке открытия файла или записи возвращается Status
|
|
|
|
|
* с описанием ошибки.
|
|
|
|
|
*
|
2026-07-19 22:58:05 +04:00
|
|
|
* @warning Класс Logger не является потокобезопасным.
|
|
|
|
|
* Одновременный вызов данного метода из нескольких потоков
|
|
|
|
|
* для одного и того же экземпляра Logger или одного файла журнала
|
|
|
|
|
* может привести к неопределённому порядку записей.
|
|
|
|
|
*
|
2026-07-19 16:48:54 +04:00
|
|
|
* @param level Уровень логирования сообщения.
|
2026-07-18 23:41:00 +04:00
|
|
|
* @param message Текст сообщения.
|
|
|
|
|
*
|
|
|
|
|
* @return Статус выполнения операции.
|
|
|
|
|
*/
|
2026-07-19 16:48:54 +04:00
|
|
|
core::Status writeMessage(LogLevel level, const std::string &message);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Записывает сообщение в журнал с уровнем логирования по умолчанию.
|
|
|
|
|
*
|
|
|
|
|
* Метод является удобной перегрузкой и эквивалентен вызову:
|
|
|
|
|
*
|
|
|
|
|
* @code
|
|
|
|
|
* writeMessage(getLogLevel(), message);
|
|
|
|
|
* @endcode
|
|
|
|
|
*
|
2026-07-19 22:58:05 +04:00
|
|
|
* @warning Класс Logger не является потокобезопасным.
|
|
|
|
|
* Одновременный вызов данного метода из нескольких потоков
|
|
|
|
|
* для одного и того же экземпляра Logger или одного файла журнала
|
|
|
|
|
* может привести к неопределённому порядку записей.
|
|
|
|
|
*
|
2026-07-19 16:48:54 +04:00
|
|
|
* @param message Текст сообщения.
|
|
|
|
|
*
|
|
|
|
|
* @return Статус выполнения операции.
|
|
|
|
|
*/
|
|
|
|
|
core::Status writeMessage(const std::string &message);
|
2026-07-18 23:41:00 +04:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @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 Возвращает текущий уровень логирования.
|
|
|
|
|
*
|
2026-07-19 16:48:54 +04:00
|
|
|
* @return Уровень логирования по умолчанию.
|
2026-07-18 23:41:00 +04:00
|
|
|
*/
|
|
|
|
|
LogLevel getLogLevel() const;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Возвращает имя файла журнала.
|
|
|
|
|
*
|
2026-07-19 16:48:54 +04:00
|
|
|
* @return Имя файла журнала.
|
2026-07-18 23:41:00 +04:00
|
|
|
*/
|
|
|
|
|
const std::string &getFileName() const;
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
/**
|
|
|
|
|
* @brief Имя файла журнала.
|
|
|
|
|
*/
|
|
|
|
|
std::string fileName_;
|
|
|
|
|
|
|
|
|
|
/**
|
2026-07-21 13:44:54 +04:00
|
|
|
* @brief Создаёт объект логгера.
|
|
|
|
|
*
|
|
|
|
|
* @param fileName Имя файла, в который будут записываться сообщения.
|
|
|
|
|
* @param defaultLevel Уровень логирования по умолчанию и минимальный уровень
|
|
|
|
|
* важности сообщений, которые будут записываться в
|
|
|
|
|
* журнал.
|
2026-07-18 23:41:00 +04:00
|
|
|
*/
|
|
|
|
|
LogLevel defaultLevel_;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace logger
|