refactor
This commit is contained in:
+394
@@ -0,0 +1,394 @@
|
||||
#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
|
||||
Reference in New Issue
Block a user