qlog.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. #ifndef QLOG_H
  2. #define QLOG_H
  3. #include <QObject>
  4. #include <QTextStream>
  5. #include <QFile>
  6. #include <QCoreApplication>
  7. #include <QSharedPointer>
  8. #include <QReadWriteLock>
  9. #include <QThread>
  10. //QtDebugMsg 0 A message generated by the qDebug() function.
  11. //QtInfoMsg 4 A message generated by the qInfo() function.
  12. //QtWarningMsg 1 A message generated by the qWarning() function.
  13. //QtCriticalMsg 2 A message generated by the qCritical() function.
  14. //QtFatalMsg 3 A message generated by the qFatal() function.
  15. #define LOG(log,Level) if (log->checkLevel(Level)) \
  16. QLOG::LogMessage(log,__FILE__, __LINE__,Level).stream()
  17. #define QLogTest(log) LOG(log,QLOG::TestMsg)
  18. #define QLogDebug(log) LOG(log,QLOG::DebugMsg)
  19. #define QLogInfo(log) LOG(log,QLOG::InfoMsg)
  20. #define QLogWarning(log) LOG(log,QLOG::WarningMsg)
  21. #define QLogCritical(log) LOG(log,QLOG::CriticalMsg)
  22. #define QLogFatal(log) LOG(log,QLOG::FatalMsg)
  23. #define LOGD(Level) if (QLOG::QLogManger::this_()->baseLog()->checkLevel(Level)) \
  24. QLOG::LogMessage(QLOG::QLogManger::this_()->baseLog(),__FILE__, __LINE__,Level).stream()
  25. #define QDTest LOGD(QLOG::TestMsg)
  26. #define QDDebug LOGD(QLOG::DebugMsg)
  27. #define QDInfo LOGD(QLOG::InfoMsg)
  28. #define QDWarning LOGD(QLOG::WarningMsg)
  29. #define QDCritical LOGD(QLOG::CriticalMsg)
  30. #define QDFatal LOGD(QLOG::FatalMsg)
  31. namespace QLOG {
  32. class QLog;
  33. enum LogLevel{
  34. TestMsg = 0,
  35. DebugMsg = 1,
  36. InfoMsg = 2,
  37. WarningMsg = 3,
  38. CriticalMsg = 4,
  39. FatalMsg = 5,
  40. };
  41. enum OutState{
  42. STD_OUT = 0,
  43. STD_ERROR = 1,
  44. File = 2
  45. };
  46. enum FileCreateType
  47. {
  48. OnlyOne,
  49. OneStartOne,
  50. DayOne,
  51. HourOne,
  52. MonthOne
  53. };
  54. class LogMessage
  55. {
  56. public:
  57. LogMessage(QLog * log, const char * file, int line, LogLevel level);
  58. LogMessage(QLog * log,LogLevel level);
  59. ~LogMessage();
  60. inline QTextStream & stream() {return ts;}
  61. private:
  62. QLog * log;
  63. QString str_;
  64. QTextStream ts;
  65. LogLevel level_;
  66. };
  67. class LogEvent;
  68. // TODO:
  69. class QLogManger : public QObject
  70. {
  71. Q_OBJECT
  72. public:
  73. ~QLogManger();
  74. static QLogManger * this_();
  75. inline QLog * baseLog()const {
  76. return _baseLog.data();
  77. }
  78. inline QLog * qDebugLog()const {
  79. return _baseLog.data();
  80. }
  81. bool setSaveFilePath(const QString & path);
  82. QLog * enbleQtMessage();
  83. QLog * getLog(const QString & name);
  84. inline QString getSaveFilePath() const {return path_;}
  85. signals:
  86. void updateSavePath();
  87. private:
  88. QString path_;
  89. QLogManger();
  90. QReadWriteLock _locker;
  91. QHash<QString, QSharedPointer<QLog>> _logs;
  92. QSharedPointer<QLog> _baseLog;
  93. QSharedPointer<QLog> _qtLog;
  94. QThread _thread;
  95. };
  96. class QLog : public QObject
  97. {
  98. Q_OBJECT
  99. public:
  100. ~QLog();
  101. inline bool checkLevel(LogLevel level) {
  102. if (level < this->level) {
  103. return false;
  104. }
  105. return true;
  106. }
  107. bool writeTime;
  108. bool writeFileInfo;
  109. bool writeLevel;
  110. bool writeEndLine;
  111. LogLevel level;
  112. FileCreateType fileCreateType;;
  113. void setOutState(OutState outState);
  114. inline OutState getOutState() const {return state_;}
  115. protected:
  116. void customEvent(QEvent * event);
  117. protected slots:
  118. void restLog();
  119. void releaseLogFile();
  120. private:
  121. OutState state_;
  122. QFile * file_;
  123. QTextStream ts_;
  124. QString _name;
  125. int _fileCreateId;
  126. private:
  127. explicit QLog(const QString & name,OutState state = File);
  128. friend class QLogManger;
  129. friend class LogMessage;
  130. };
  131. } //namespace QLOG
  132. #endif // QLOG_H