Files
QTradeProgram/Sqbase/qlogmanager.h
2025-08-15 15:56:40 +08:00

233 lines
6.0 KiB
C++

////#ifndef QLOGMANAGER_H
////#define QLOGMANAGER_H
////
////#include <QObject>
////#include <QString>
////#include <QMutex>
////#include <QDir>
////
////// 日志级别枚举
////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 <QObject>
//#include <QString>
//#include <QDir>
//#include <QMutex>
//#include <QQueue>
//#include <QSharedPointer>
//#include <QSemaphore>
//#include <QThread>
//#include <QFile>
//#include <QMap>
//
//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<QPair<LogLevel, QString>> logQueue;
// QSemaphore queueSemaphore;
// bool running;
//
// QDir logDirectory;
// LogLevel minLevel;
// QMap<LogLevel, QSharedPointer<QFile>> 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 <QObject>
#include <QThread>
#include <QFile>
#include <QMutex>
#include <QSemaphore>
#include <QSharedPointer>
#include <QQueue>
#include <QDateTime>
#include <QDir>
#include <QFileInfo>
#include <QtCore/qatomic.h>
#include <QMap>
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<LogEntry> m_queue;
mutable QMutex m_mutex;
};
static QBasicAtomicPointer<QLogManager> s_instance;
static QMutex s_mutex;
QDir m_logDirectory;
LogLevel m_minLevel;
QThread* m_workerThread;
QSemaphore m_queueSemaphore;
ThreadSafeQueue m_logQueue;
QMap<LogLevel, QSharedPointer<QFile>> 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