#ifndef LOGMANAGER_H #define LOGMANAGER_H #include #include #include #include #include #include #include #include // ============================================================================ // ПЕРЕЧИСЛЕНИЯ И СТРУКТУРЫ // ============================================================================ /** * @brief Уровни логирования */ enum class LogLevel { Info = 0, // Информационные сообщения Warning = 1, // Предупреждения Error = 2, // Ошибки Debug = 3, // Отладочная информация Critical = 4 // Критические ошибки }; /** * @brief Настройки логирования */ struct LogSettings { bool logToFile = true; // Сохранять в файл bool logToConsole = true; // Выводить в консоль bool logToDatabase = false; // Сохранять в БД QString logFilePath = ""; // Путь к файлу логов int maxFileSizeMB = 10; // Максимальный размер файла (МБ) int maxFileCount = 5; // Максимальное количество файлов bool showTimestamp = true; // Показывать время bool showModule = true; // Показывать модуль bool showMethod = true; // Показывать метод QMap colors; // Цвета для уровней }; /** * @brief Запись лога */ struct LogEntry { QDateTime timestamp; // Время записи LogLevel level; // Уровень QString module; // Модуль/компонент QString method; // Метод/функция QString message; // Сообщение qint64 threadId = 0; // ID потока QString sourceFile = ""; // Исходный файл int sourceLine = 0; // Строка в файле // Методы для форматирования QString toString() const; QString toHtml() const; QString toCsv() const; QString toJson() const; // Статические методы static QString levelToString(LogLevel level); static QColor levelToColor(LogLevel level); static QString formatDateTime(const QDateTime& dt); }; // ============================================================================ // КЛАСС LOGMANAGER // ============================================================================ /** * @brief Менеджер логирования приложения */ class LogManager : public QObject { Q_OBJECT public: // ======================================================================== // СИНГЛТОН // ======================================================================== /** * @brief Получить экземпляр менеджера (синглтон) */ static LogManager* instance(); /** * @brief Инициализировать менеджер * @param settings Настройки логирования */ static void initialize(const LogSettings& settings = LogSettings()); /** * @brief Очистить менеджер (освободить ресурсы) */ static void cleanup(); // ======================================================================== // ОСНОВНОЙ ИНТЕРФЕЙС // ======================================================================== /** * @brief Добавить запись в лог * @param level Уровень логирования * @param module Модуль/компонент * @param method Метод/функция * @param message Сообщение */ void log(LogLevel level, const QString& module, const QString& method, const QString& message); /** * @brief Добавить запись в лог с информацией об исходном коде */ void log(LogLevel level, const QString& module, const QString& method, const QString& message, const QString& sourceFile, int sourceLine); // Быстрые методы для разных уровней void info(const QString& module, const QString& method, const QString& message); void warning(const QString& module, const QString& method, const QString& message); void error(const QString& module, const QString& method, const QString& message); void debug(const QString& module, const QString& method, const QString& message); void critical(const QString& module, const QString& method, const QString& message); // ======================================================================== // ФИЛЬТРАЦИЯ И ПОИСК // ======================================================================== /** * @brief Получить все записи */ QList allEntries() const; /** * @brief Получить записи за указанный период */ QList entriesByTime(const QDateTime& from, const QDateTime& to) const; /** * @brief Получить записи по уровню */ QList entriesByLevel(LogLevel level) const; /** * @brief Получить записи по модулю */ QList entriesByModule(const QString& module) const; /** * @brief Поиск по тексту сообщения */ QList search(const QString& text, bool caseSensitive = false) const; /** * @brief Применить фильтр */ QList filter(const QList& levels, const QString& moduleFilter = "", const QString& methodFilter = "") const; // ======================================================================== // УПРАВЛЕНИЕ // ======================================================================== /** * @brief Очистить все записи */ void clear(); /** * @brief Сохранить логи в файл */ bool saveToFile(const QString& filePath, bool append = false); /** * @brief Загрузить логи из файла */ bool loadFromFile(const QString& filePath); /** * @brief Экспортировать в формат */ bool exportToFormat(const QString& filePath, const QString& format = "txt"); /** * @brief Получить статистику */ QMap statistics() const; /** * @brief Получить количество записей */ int count() const; /** * @brief Получить максимальное количество записей в памяти */ int maxEntries() const; /** * @brief Установить максимальное количество записей в памяти */ void setMaxEntries(int max); // ======================================================================== // НАСТРОЙКИ // ======================================================================== /** * @brief Получить текущие настройки */ LogSettings settings() const; /** * @brief Обновить настройки */ void updateSettings(const LogSettings& newSettings); /** * @brief Сохранить настройки в конфиг */ void saveSettings(QSettings& settings); /** * @brief Загрузить настройки из конфига */ void loadSettings(QSettings& settings); // ======================================================================== // УТИЛИТЫ // ======================================================================== /** * @brief Включить/выключить логирование в файл */ void setLogToFileEnabled(bool enabled); /** * @brief Включить/выключить логирование в консоль */ void setLogToConsoleEnabled(bool enabled); /** * @brief Установить путь к файлу логов */ void setLogFilePath(const QString& path); /** * @brief Установить цвета для уровней */ void setLevelColors(const QMap& colors); /** * @brief Установить цвет для уровня */ void setLevelColor(LogLevel level, const QColor& color); /** * @brief Установить формат вывода */ void setFormat(bool showTimestamp, bool showModule, bool showMethod); signals: // ======================================================================== // СИГНАЛЫ // ======================================================================== /** * @brief Добавлена новая запись в лог */ void entryAdded(const LogEntry& entry); /** * @brief Логи очищены */ void logCleared(); /** * @brief Настройки изменены */ void settingsChanged(); /** * @brief Ошибка при записи в файл */ void fileError(const QString& error); // Сигналы для конкретных уровней (для удобства) void infoAdded(const LogEntry& entry); void warningAdded(const LogEntry& entry); void errorAdded(const LogEntry& entry); void debugAdded(const LogEntry& entry); void criticalAdded(const LogEntry& entry); private: // ======================================================================== // ПРИВАТНЫЙ КОНСТРУКТОР (синглтон) // ======================================================================== explicit LogManager(QObject* parent = nullptr); ~LogManager(); // ======================================================================== // ПРИВАТНЫЕ МЕТОДЫ // ======================================================================== /** * @brief Записать в файл */ void writeToFile(const LogEntry& entry); /** * @brief Ротация лог-файлов */ void rotateLogFile(); /** * @brief Проверить размер файла */ bool checkFileSize(); /** * @brief Форматирование записи для вывода */ QString formatEntry(const LogEntry& entry) const; /** * @brief Форматирование для консоли */ QString formatForConsole(const LogEntry& entry) const; /** * @brief Форматирование для файла */ QString formatForFile(const LogEntry& entry) const; // ======================================================================== // ЧЛЕНЫ КЛАССА // ======================================================================== static LogManager* m_instance; // Экземпляр синглтона QList m_entries; // Список записей LogSettings m_settings; // Настройки mutable QMutex m_mutex; // Мьютекс для потокобезопасности QFile m_logFile; // Файл логов QTextStream m_logStream; // Поток для записи в файл int m_maxEntries = 10000; // Максимальное количество записей // Предварительное объявление для Q_DISABLE_COPY LogManager(const LogManager&) = delete; LogManager& operator=(const LogManager&) = delete; }; // ============================================================================ // МАКРОСЫ ДЛЯ УДОБСТВА // ============================================================================ // Базовый макрос #define LOG(level, module, method, message) \ LogManager::instance()->log(level, module, method, message, __FILE__, __LINE__) // Макросы для уровней #define LOG_INFO(module, method, message) \ LOG(LogLevel::Info, module, method, message) #define LOG_WARNING(module, method, message) \ LOG(LogLevel::Warning, module, method, message) #define LOG_ERROR(module, method, message) \ LOG(LogLevel::Error, module, method, message) #define LOG_DEBUG(module, method, message) \ LOG(LogLevel::Debug, module, method, message) #define LOG_CRITICAL(module, method, message) \ LOG(LogLevel::Critical, module, method, message) // Макрос для проверки на отладку #ifdef QT_DEBUG #define LOG_DEBUG_ONLY(module, method, message) LOG_DEBUG(module, method, message) #else #define LOG_DEBUG_ONLY(module, method, message) Q_UNUSED(module); Q_UNUSED(method); Q_UNUSED(message) #endif #endif // LOGMANAGER_H