395 lines
13 KiB
C++
395 lines
13 KiB
C++
#ifndef LOGMANAGER_H
|
||
#define LOGMANAGER_H
|
||
|
||
#include <QObject>
|
||
#include <QDateTime>
|
||
#include <QColor>
|
||
#include <QList>
|
||
#include <QMutex>
|
||
#include <QFile>
|
||
#include <QTextStream>
|
||
#include <QSettings>
|
||
|
||
// ============================================================================
|
||
// ПЕРЕЧИСЛЕНИЯ И СТРУКТУРЫ
|
||
// ============================================================================
|
||
|
||
/**
|
||
* @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<LogLevel, QColor> 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<LogEntry> allEntries() const;
|
||
|
||
/**
|
||
* @brief Получить записи за указанный период
|
||
*/
|
||
QList<LogEntry> entriesByTime(const QDateTime& from,
|
||
const QDateTime& to) const;
|
||
|
||
/**
|
||
* @brief Получить записи по уровню
|
||
*/
|
||
QList<LogEntry> entriesByLevel(LogLevel level) const;
|
||
|
||
/**
|
||
* @brief Получить записи по модулю
|
||
*/
|
||
QList<LogEntry> entriesByModule(const QString& module) const;
|
||
|
||
/**
|
||
* @brief Поиск по тексту сообщения
|
||
*/
|
||
QList<LogEntry> search(const QString& text, bool caseSensitive = false) const;
|
||
|
||
/**
|
||
* @brief Применить фильтр
|
||
*/
|
||
QList<LogEntry> filter(const QList<LogLevel>& 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<LogLevel, int> 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<LogLevel, QColor>& 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<LogEntry> 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
|