233 lines
6.0 KiB
C
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
|