Files
TTW_Bot/logmanager.h
T
2026-02-07 08:28:56 +03:00

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