Files
QTradeProgram/cleaned_source_code/Sqbase/qlogmanager.h
2026-02-25 23:01:42 +08:00

87 lines
2.4 KiB
C++

#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* Instance();
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;
static const int TIMESTAMP_CACHE_DURATION_MS = 100;
};
#define LOG_DEBUG(message) QLogManager::Instance()->log(QLogManager ::SQ_DEBUG, message, QString("%1::%2").arg(__FILE__).arg(__LINE__))
#define LOG_INFO(message) QLogManager::Instance()->log(QLogManager ::SQ_INFO, message)
#define LOG_WARNING(message) QLogManager::Instance()->log(QLogManager ::SQ_WARNING, message)
#define LOG_ERROR(message) QLogManager::Instance()->log(QLogManager ::SQ_ERROR, message)
#define LOG_FATAL(message) QLogManager::Instance()->log(QLogManager ::SQ_FATAL, message)
#endif