pqlog.h 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. #ifndef PQ_PQLog_H
  2. #define PQ_PQLog_H
  3. #include <QObject>
  4. #include <QTextStream>
  5. #include <QFile>
  6. #include <QCoreApplication>
  7. #include <QSharedPointer>
  8. #include <QReadWriteLock>
  9. #include <QThread>
  10. //#ifdef _MSC_VER
  11. //#pragma execution_character_set("utf-8")
  12. //#endif
  13. #define LOG(log,Level) if (log->checkLevel(Level)) \
  14. PQ::LogMessage(log,__FILE__, __LINE__,Level).stream()
  15. #define pqTest(log) LOG(log,PQ::TestMsg)
  16. #define pqDebug(log) LOG(log,PQ::DebugMsg)
  17. #define pqInfo(log) LOG(log,PQ::InfoMsg)
  18. #define pqWarning(log) LOG(log,PQ::WarningMsg)
  19. #define pqCritical(log) LOG(log,PQ::CriticalMsg)
  20. #define pqFatal(log) LOG(log,PQ::FatalMsg)
  21. #define LOGD(Level) if (PQ::PQLogManger::this_()->baseLog()->checkLevel(Level)) \
  22. PQ::LogMessage(PQ::PQLogManger::this_()->baseLog(),__FILE__, __LINE__,Level).stream()
  23. #define pqDTest LOGD(PQ::TestMsg)
  24. #define pqDDebug LOGD(PQ::DebugMsg)
  25. #define pqDInfo LOGD(PQ::InfoMsg)
  26. #define pqDWarning LOGD(PQ::WarningMsg)
  27. #define pqDCritical LOGD(PQ::CriticalMsg)
  28. #define pqDFatal LOGD(PQ::FatalMsg)
  29. namespace PQ {
  30. class PQLog;
  31. class LogMessage;
  32. // 等级递增,只记录 >= 设置的level
  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, // std::out
  43. STD_ERROR = 1, // std::erro
  44. File = 2 // 文件
  45. };
  46. enum FileCreateType
  47. {
  48. OnlyOne, //一直保存在一个文件中
  49. OneStartOne, // 每次程序启动生成新的
  50. DayOne, // 每日一个
  51. HourOne, // 每小时一个
  52. MonthOne // 每月一个
  53. };
  54. class LogEvent;
  55. class PQLogManger : public QObject
  56. {
  57. Q_OBJECT
  58. public:
  59. ~PQLogManger();
  60. static PQLogManger * this_();
  61. // 获取默认日志
  62. inline PQLog * baseLog()const {
  63. return _baseLog.data();
  64. }
  65. //获取Qt日志,可能为空,为空为为未接管
  66. inline PQLog * qDebugLog()const {
  67. return _qtLog.data();
  68. }
  69. // 设置日志保存位置
  70. bool setSaveFilePath(const QString & path);
  71. // 开启接管 Qt 日志 qdebug()
  72. PQLog * enbleQtMessage();
  73. // 获取自定义日志
  74. PQLog * getLog(const QString & name);
  75. // 获取当前日志目录
  76. inline QString getSaveFilePath() const {return path_;}
  77. signals:
  78. void updateSavePath();
  79. private:
  80. QString path_;
  81. PQLogManger();
  82. QReadWriteLock _locker;
  83. QHash<QString, QSharedPointer<PQLog>> _logs;
  84. QSharedPointer<PQLog> _baseLog;
  85. QSharedPointer<PQLog> _qtLog;
  86. QThread _thread;
  87. };
  88. class PQLog : public QObject
  89. {
  90. Q_OBJECT
  91. public:
  92. ~PQLog();
  93. inline bool checkLevel(LogLevel level) {
  94. if (level < this->level) {
  95. return false;
  96. }
  97. return true;
  98. }
  99. bool writeTime; // 是否记录日志时间
  100. bool writeFileInfo; // 是否记录日志在代码中的文件位置
  101. bool writeLevel; // 是否记录等级
  102. bool writeEndLine; // 是否自动换行
  103. LogLevel level; // 记录等级
  104. FileCreateType fileCreateType; //文件的生成方式
  105. // 输出位置
  106. void setOutState(OutState outState);
  107. inline OutState getOutState() const {return state_;}
  108. protected:
  109. void customEvent(QEvent * event);
  110. protected slots:
  111. void restLog();
  112. void releaseLogFile();
  113. private:
  114. OutState state_;
  115. QFile * file_;
  116. QTextStream ts_;
  117. QString _name;
  118. int _fileCreateId;
  119. private:
  120. explicit PQLog(const QString & name,OutState state = File);
  121. friend class PQLogManger;
  122. friend class LogMessage;
  123. };
  124. // private: 不要直接操作
  125. class LogMessage
  126. {
  127. public:
  128. LogMessage(PQLog * log, const char * file, int line, LogLevel level);
  129. LogMessage(PQLog * log,LogLevel level);
  130. ~LogMessage();
  131. inline QTextStream & stream() {return ts;}
  132. private:
  133. PQLog * log;
  134. QString str_;
  135. QTextStream ts;
  136. LogLevel level_;
  137. };
  138. } //namespace PQLog
  139. #endif // PQLog_H