TTW_Bot/logmanager.h

395 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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