#ifndef QLOG_H #define QLOG_H #include #include #include #include #include #include #include //QtDebugMsg 0 A message generated by the qDebug() function. //QtInfoMsg 4 A message generated by the qInfo() function. //QtWarningMsg 1 A message generated by the qWarning() function. //QtCriticalMsg 2 A message generated by the qCritical() function. //QtFatalMsg 3 A message generated by the qFatal() function. #define LOG(log,Level) if (log->checkLevel(Level)) \ QLOG::LogMessage(log,__FILE__, __LINE__,Level).stream() #define QLogTest(log) LOG(log,QLOG::TestMsg) #define QLogDebug(log) LOG(log,QLOG::DebugMsg) #define QLogInfo(log) LOG(log,QLOG::InfoMsg) #define QLogWarning(log) LOG(log,QLOG::WarningMsg) #define QLogCritical(log) LOG(log,QLOG::CriticalMsg) #define QLogFatal(log) LOG(log,QLOG::FatalMsg) #define LOGD(Level) if (QLOG::QLogManger::this_()->baseLog()->checkLevel(Level)) \ QLOG::LogMessage(QLOG::QLogManger::this_()->baseLog(),__FILE__, __LINE__,Level).stream() #define QDTest LOGD(QLOG::TestMsg) #define QDDebug LOGD(QLOG::DebugMsg) #define QDInfo LOGD(QLOG::InfoMsg) #define QDWarning LOGD(QLOG::WarningMsg) #define QDCritical LOGD(QLOG::CriticalMsg) #define QDFatal LOGD(QLOG::FatalMsg) namespace QLOG { class QLog; enum LogLevel{ TestMsg = 0, DebugMsg = 1, InfoMsg = 2, WarningMsg = 3, CriticalMsg = 4, FatalMsg = 5, }; enum OutState{ STD_OUT = 0, STD_ERROR = 1, File = 2 }; enum FileCreateType { OnlyOne, OneStartOne, DayOne, HourOne, MonthOne }; class LogMessage { public: LogMessage(QLog * log, const char * file, int line, LogLevel level); LogMessage(QLog * log,LogLevel level); ~LogMessage(); inline QTextStream & stream() {return ts;} private: QLog * log; QString str_; QTextStream ts; LogLevel level_; }; class LogEvent; // TODO: class QLogManger : public QObject { Q_OBJECT public: ~QLogManger(); static QLogManger * this_(); inline QLog * baseLog()const { return _baseLog.data(); } inline QLog * qDebugLog()const { return _baseLog.data(); } bool setSaveFilePath(const QString & path); QLog * enbleQtMessage(); QLog * getLog(const QString & name); inline QString getSaveFilePath() const {return path_;} signals: void updateSavePath(); private: QString path_; QLogManger(); QReadWriteLock _locker; QHash> _logs; QSharedPointer _baseLog; QSharedPointer _qtLog; QThread _thread; }; class QLog : public QObject { Q_OBJECT public: ~QLog(); inline bool checkLevel(LogLevel level) { if (level < this->level) { return false; } return true; } bool writeTime; bool writeFileInfo; bool writeLevel; bool writeEndLine; LogLevel level; FileCreateType fileCreateType;; void setOutState(OutState outState); inline OutState getOutState() const {return state_;} protected: void customEvent(QEvent * event); protected slots: void restLog(); void releaseLogFile(); private: OutState state_; QFile * file_; QTextStream ts_; QString _name; int _fileCreateId; private: explicit QLog(const QString & name,OutState state = File); friend class QLogManger; friend class LogMessage; }; } //namespace QLOG #endif // QLOG_H