////#ifndef QLOGMANAGER_H ////#define QLOGMANAGER_H //// ////#include ////#include ////#include ////#include //// ////// 日志级别枚举 ////enum LogLevel { //// SQ_DEBUG, //// SQ_INFO, //// SQ_WARNING, //// SQ_ERROR, //// SQ_FATAL ////}; //// ////// 日志管理类 ////class QLogManager : public QObject { //// Q_OBJECT ////private: //// static QLogManager* instance; //// QMutex mutex; //// QString logDirectory; //// int maxLogDays = 7; //// //// explicit QLogManager(QObject* parent = nullptr); //// ////public: //// static QLogManager* getInstance(); //// //// void log(LogLevel level, const QString& message, const QString& module = "System"); //// QString getLogFileName(LogLevel level); //// ////signals: //// void newLog(LogLevel level, const QString& logLine); //// ////private: //// void writeToFile(LogLevel level, const QString& logLine); //// void cleanOldLogs(); ////}; //// //// 日志宏定义 //#define LOG_DEBUG(message) QLogManager::getInstance()->log(QLogManager::SQ_DEBUG, message, QString("%1::%2").arg(__FILE__).arg(__LINE__)) //#define LOG_INFO(message) QLogManager::getInstance()->log(QLogManager::SQ_INFO, message) //#define LOG_WARNING(message) QLogManager::getInstance()->log(QLogManager::SQ_WARNING, message) //#define LOG_ERROR(message) QLogManager::getInstance()->log(QLogManager::SQ_ERROR, message) //#define LOG_FATAL(message) QLogManager::getInstance()->log(QLogManager::SQ_FATAL, message) // ////#endif // QLOGMANAGER_H //#ifndef QLOGMANAGER_H //#define QLOGMANAGER_H // //#include //#include //#include //#include //#include //#include //#include //#include //#include //#include // //class QLogManager : public QObject //{ // Q_OBJECT // //public: // enum LogLevel { // SQ_DEBUG = 0, // SQ_INFO, // SQ_WARNING, // SQ_ERROR, // SQ_FATAL // }; // Q_ENUM(LogLevel) // // static QLogManager* getInstance(); // static void destroyInstance(); // // void setLogLevel(LogLevel level); // void log(LogLevel level, const QString& message, const QString& module = QString()); // void flush(); // //signals: // void newLog(QLogManager::LogLevel level, const QString& message); // //private: // explicit QLogManager(QObject* parent = nullptr); // ~QLogManager(); // // QString getLogFileName(LogLevel level); // void writeToFile(LogLevel level, const QString& logLine); // void rotateLogFile(LogLevel level); // void cleanOldLogs(); // void processLogs(); // // static QLogManager* instance; // static const int maxLogDays; // 保留7天日志 // static const qint64 maxFileSize; // 最大文件大小(在cpp中定义) // // QMutex mutex; // QThread* workerThread; // QQueue> logQueue; // QSemaphore queueSemaphore; // bool running; // // QDir logDirectory; // LogLevel minLevel; // QMap> openFiles; // // Q_DISABLE_COPY(QLogManager) //}; // // //// 日志宏定义 //#define LOG_DEBUG(message) QLogManager::getInstance()->log(QLogManager ::SQ_DEBUG, message, QString("%1::%2").arg(__FILE__).arg(__LINE__)) //#define LOG_INFO(message) QLogManager::getInstance()->log(QLogManager ::SQ_INFO, message) //#define LOG_WARNING(message) QLogManager::getInstance()->log(QLogManager ::SQ_WARNING, message) //#define LOG_ERROR(message) QLogManager::getInstance()->log(QLogManager ::SQ_ERROR, message) //#define LOG_FATAL(message) QLogManager::getInstance()->log(QLogManager ::SQ_FATAL, message) // //#endif // QLOGMANAGER_H // // qlogmanager.h #ifndef QLOGMANAGER_H #define QLOGMANAGER_H #include #include #include #include #include #include #include #include #include #include #include #include class QLogManager : public QObject { Q_OBJECT public: enum LogLevel { SQ_DEBUG = 0, SQ_INFO, SQ_WARNING, SQ_ERROR, SQ_FATAL }; static QLogManager* getInstance(); static void destroyInstance(); void setLogLevel(LogLevel level); void log(LogLevel level, const QString& message, const QString& module = QString()); void flush(); signals: void newLog(LogLevel level, const QString& message); protected: explicit QLogManager(QObject* parent = nullptr); ~QLogManager() override; private: void processLogs(); void writeToFile(LogLevel level, const QString& logLine); void rotateLogFile(LogLevel level); void cleanOldLogs(); QString getLogFileName(LogLevel level); struct LogEntry { LogLevel level; QString message; qint64 timestamp; }; class ThreadSafeQueue { public: void enqueue(const LogEntry& entry) { QMutexLocker locker(&m_mutex); m_queue.enqueue(entry); } bool dequeue(LogEntry& entry) { QMutexLocker locker(&m_mutex); if (m_queue.isEmpty()) { return false; } entry = m_queue.dequeue(); return true; } bool isEmpty() const { QMutexLocker locker(&m_mutex); return m_queue.isEmpty(); } private: QQueue m_queue; mutable QMutex m_mutex; }; static QBasicAtomicPointer s_instance; static QMutex s_mutex; QDir m_logDirectory; LogLevel m_minLevel; QThread* m_workerThread; QSemaphore m_queueSemaphore; ThreadSafeQueue m_logQueue; QMap> m_openFiles; bool m_running; // 配置常量 static const int MAX_LOG_DAYS = 7; static const qint64 MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB static const int TIMESTAMP_CACHE_DURATION_MS = 100; // 100ms }; // 日志宏定义 #define LOG_DEBUG(message) QLogManager::getInstance()->log(QLogManager ::SQ_DEBUG, message, QString("%1::%2").arg(__FILE__).arg(__LINE__)) #define LOG_INFO(message) QLogManager::getInstance()->log(QLogManager ::SQ_INFO, message) #define LOG_WARNING(message) QLogManager::getInstance()->log(QLogManager ::SQ_WARNING, message) #define LOG_ERROR(message) QLogManager::getInstance()->log(QLogManager ::SQ_ERROR, message) #define LOG_FATAL(message) QLogManager::getInstance()->log(QLogManager ::SQ_FATAL, message) #endif // QLOGMANAGER_H