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
|