log.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. #ifndef LOG_H
  2. #define LOG_H
  3. #include <QApplication>
  4. #include <QReadWriteLock>
  5. #include <QFile>
  6. /**
  7. * @brief The Color class 颜色设置
  8. */
  9. class ConsoleFont {
  10. public:
  11. const static int DEFAULT; // 重置颜色设置
  12. const static int BOLD; // 加粗
  13. const static int UN_BOLD; // 去粗
  14. const static int UNDER_LINE; // 下滑线
  15. const static int GLINT; // 闪烁
  16. const static int INVERSE;// 反色
  17. const static int BOLD_2; // 加粗
  18. const static int NORMAL ; // 正常
  19. const static int UN_UNDER_LINE; // 去掉下滑线
  20. const static int STOP_GLINT; // 停止闪烁
  21. const static int INVERSE_2;// 反色
  22. const static int FORE_GROUND_BLACK;// 前景,黑色
  23. const static int FORE_GROUND_RED;// 前景,红色
  24. const static int FORE_GROUND_GREEN;// 前景,绿色
  25. const static int FORE_GROUND_ORANGE;// 前景,黄色
  26. const static int FORE_GROUND_BLUE; //前景,篮色
  27. const static int FORE_GROUND_PURPLE; //前景,紫色
  28. const static int FORE_GROUND_CYAN; //前景,青色
  29. const static int FORE_GROUND_WHITE; //前景,白色
  30. const static int BACK_GROUND_BLACK;// 背景,黑色
  31. const static int BACK_GROUND_RED;// 背景,红色
  32. const static int BACK_GROUND_GREEN;// 背景,绿色
  33. const static int BACK_GROUND_ORANGE;// 背景,黄色
  34. const static int BACK_GROUND_BLUE; //背景,篮色
  35. const static int BACK_GROUND_PURPLE; //背景,紫色
  36. const static int BACK_GROUND_CYAN; //背景,青色
  37. const static int BACK_GROUND_WHITE; //背景,白色
  38. /**
  39. * @brief setConsoleFont 设置控制台字体样式
  40. * @param codes 字体样式code集合,用{}设置数组的方式进行传参
  41. * @param msg 信息
  42. * @return 设置样式后的内容
  43. */
  44. const static QString setConsoleFont(std::initializer_list<int> codes, QString msg);
  45. };
  46. /**
  47. * @brief The LogType enum 日志输出类型
  48. */
  49. enum LogOutType {
  50. STANDARD_OUTPUT, // 标准输出流
  51. STANDARD_ERROR_OUTPUT // 标准错误输出流
  52. };
  53. /**
  54. * @brief The LogSwitchoverType enum 日志切换方式(即备份方式)
  55. */
  56. enum LogSwitchoverType{
  57. ALL_DAY, // 指定天数备份,即相隔天数的凌晨00:00:00(对应单位是天d)
  58. TIME_PERIOD, // 指定时间间隔备份,即从项目启动开始后的间隔时间周期(对应单位是秒s)
  59. FILE_SIZE // 指定文件大小备份(对应单位是kb)
  60. };
  61. /**
  62. * 回调函数,日志类型、日志上下文,日志信息、格式化之后的信息,传入对象上下文
  63. */
  64. typedef void (*LogInfoCallBackHandler)(QtMsgType, const QMessageLogContext &, const QString &,const QString &,void *);
  65. /**
  66. * @brief The CallBackInfo class 回调信息
  67. */
  68. class CallBackInfo{
  69. public:
  70. CallBackInfo() {}
  71. CallBackInfo(QString unique, LogInfoCallBackHandler hander, void* context) {
  72. this->unique = unique;
  73. this->hander = hander;
  74. this->context = context;
  75. }
  76. QString unique; // 唯一标识
  77. LogInfoCallBackHandler hander; // 回调函数
  78. void* context; // 对象上下文
  79. };
  80. /**
  81. * 回调信息线程安全集合
  82. */
  83. class CallBackInfoSafeList{
  84. public:
  85. CallBackInfoSafeList() {}
  86. void add(CallBackInfo info){
  87. QWriteLocker lock(readWriteLock);
  88. this->mList.append(info);
  89. }
  90. QList<CallBackInfo> getList(){
  91. QReadLocker lock(readWriteLock);
  92. return mList;
  93. }
  94. CallBackInfo get(int index){
  95. QReadLocker lock(readWriteLock);
  96. return mList.value(index);
  97. }
  98. private:
  99. QList<CallBackInfo> mList; // 回调信息集合
  100. mutable QReadWriteLock *readWriteLock = new QReadWriteLock(); // 读写锁
  101. };
  102. /**
  103. * @brief The Log class 日志
  104. */
  105. class Log
  106. {
  107. public:
  108. Log() {}
  109. const static QString INFO_FORMAT_TIME; // 格式化输出日期表示
  110. const static QString INFO_FORMAT_LEVEL; // 格式化输出日志级别表示
  111. const static QString INFO_FORMAT_CODE_FILE; // 格式化输出代码文件地址表示
  112. const static QString INFO_FORMAT_CODE_LINE; // 格式化输出代码所在行表示
  113. const static QString INFO_FORMAT_CODE_FUNCTION; // 格式化输出代码所在方法函数表示
  114. const static QString INFO_FORMAT_CODE_MSG; // 格式化输出代码打印内容表示
  115. /**
  116. * @brief setFormat 设置日志输出内容格式化
  117. * @param infoFormat 内容格式化参数
  118. * @param timeFormat 日期格式化
  119. */
  120. static void setFormat(QString infoFormat, QString timeFormat = "yyyy-MM-dd hh:mm:ss:zzz");
  121. /**
  122. * @brief setLevelColor 设置不同日志级别的字体格式
  123. * @param type 日志类型
  124. * @param levelColor 字体格式
  125. */
  126. static void setLevelFont(QtMsgType type, std::initializer_list<int> levelFont);
  127. /**
  128. * @brief setOutLogPath 设置输出地址
  129. * @param outLogPath 日志输出地址
  130. */
  131. static void setOutLogPath(QString outLogPath);
  132. /**
  133. * @brief setOutLogParamPath 设置日志备份参数json存储地址
  134. * @param logParamPath 日志备份参数json存储地址
  135. */
  136. static void setOutLogParamJsonPath(QString logParamJsonPath);
  137. /**
  138. * @brief setLogSwitchover 设置日志切换备份方式
  139. * @param logSwitchoverType 日志备份类型
  140. * @param switchoverNum 备份时间或大小(ALL_DAY则是天数;TIME_PERIOD是时间间隔,单位秒;FILE_SIZE是文件大小,单位时kb)
  141. */
  142. static void setLogSwitchover(LogSwitchoverType logSwitchoverType, long long switchoverNum);
  143. /**
  144. * @brief setDistinguishLevel 设置备份输出是否区分日志级别单独输出
  145. * @param isDistinguishLevel 是否区分
  146. */
  147. static void setDistinguishLevel(bool isDistinguishLevel);
  148. /**
  149. * @brief messageOutput 日志输出注册函数
  150. * @param type 日志信息类型
  151. * @param context 日志信息上下文
  152. * @param msg 输出内容信息
  153. */
  154. static void messageOutput(QtMsgType type, const QMessageLogContext &context, const QString &msg);
  155. /**
  156. * @brief registLogInfoCallBack 注册回调函数,注册函数使用链式调用,只要注册的函数都会进行调用
  157. * @param unique 唯一标识
  158. * @param hander 回调函数
  159. * @param contex 上下文,可以传入自己想操作的对象
  160. * @return
  161. */
  162. static LogInfoCallBackHandler registLogInfoCallBack(QString unique, LogInfoCallBackHandler hander,void* context = nullptr);
  163. private:
  164. /**
  165. * @brief msgTypeMap 日志类型与标识、输出类型映射
  166. */
  167. static QMap<QtMsgType,QPair<QString, LogOutType>> msgTypeMap;
  168. /**
  169. * @brief levelFontMap 针对不同日志级别的字体显示设置映射
  170. */
  171. static QMap<QtMsgType,std::initializer_list<int>> levelFontMap;
  172. /**
  173. * @brief logSwitchoverTypeMap 备份类型与字符的映射
  174. */
  175. static QMap<LogSwitchoverType, QString> logSwitchoverTypeMap;
  176. /**
  177. * @brief outLogFile 输出file
  178. */
  179. static QFile* outLogFile;
  180. /**
  181. * @brief levelPaths 不同级别对应的输出路径
  182. */
  183. static QMap<QtMsgType, QFile*> levelPaths;
  184. /**
  185. * @brief isDistinguishLevel 是否区分日志级别输出
  186. */
  187. static bool isDistinguishLevel;
  188. /**
  189. * @brief infoFormat 日志输出内容格式化参数
  190. */
  191. static QString infoFormat;
  192. /**
  193. * @brief timeFormat 日期格式
  194. */
  195. static QString timeFormat;
  196. /**
  197. * @brief logParamJsonFile 日志备份策略参数保存json文件
  198. */
  199. static QFile* logParamJsonFile;
  200. /**
  201. * @brief logSwitchoverType 指定备份类型
  202. */
  203. static LogSwitchoverType logSwitchoverType;
  204. /**
  205. * @brief switchoverNum 指定备份时间或大小
  206. */
  207. static long long switchoverNum;
  208. /**
  209. * @brief switchoverTime 备份切换时间
  210. */
  211. static QDateTime switchoverTime;
  212. /**
  213. * @brief isLoadLogSwitchoverSetting 是否加载备份日志设置
  214. */
  215. static bool isLoadLogSwitchoverSetting;
  216. /**
  217. * @brief pCallback 存放回调函数的集合
  218. */
  219. static CallBackInfoSafeList pCallbacks;
  220. /**
  221. * @brief initMsgTypeMap 初始化日志类型与标识、输出类型映射
  222. * @return 日志类型与标识、输出类型映射
  223. */
  224. static QMap<QtMsgType,QPair<QString, LogOutType>> initMsgTypeMap();
  225. /**
  226. * @brief initLevelColors 初始化不同日志级别的字体显示设置映射
  227. */
  228. static QMap<QtMsgType,std::initializer_list<int>> initLevelFonts();
  229. /**
  230. * @brief initLogSwitchoverTypeMap 初始化备份类型与字符的映射
  231. */
  232. static QMap<LogSwitchoverType, QString> initLogSwitchoverTypeMap();
  233. /**
  234. * @brief writeLog 输出日志内容到文件
  235. * @param str 日志内容
  236. * @param QtMsgType 日志类型
  237. */
  238. static void writeLog(QString str, QtMsgType msgType);
  239. /**
  240. * @brief loadLogSwitchoverSetting 加载日志备份设置
  241. */
  242. static void loadLogSwitchoverSetting();
  243. /**
  244. * @brief logSwitchoverSettingHander 日志备份设置处理
  245. */
  246. static void logSwitchoverSettingHander();
  247. /**
  248. * @brief writeLogParamJson 向json文件中写入备份参数
  249. */
  250. static void writeLogParamJson();
  251. /**
  252. * @brief copyLogOutFile 备份日志文件
  253. */
  254. static void copyLogOutFile(QtMsgType msgType);
  255. /**
  256. * @brief copy 拷贝文件,目标文件存在则覆盖
  257. * @param srcFilepPath 源文件
  258. * @param targetFilePath 目标文件
  259. * @param 拷贝成功与否
  260. */
  261. static bool copy(QString srcFilepPath, QString targetFilePath);
  262. /**
  263. * @brief replace 替换字符串
  264. * @param src 原字符串
  265. * @param before 被替换的字符串
  266. * @param after 替换字符串
  267. * @return 被替换之后的字符串
  268. */
  269. static QString replace(QString src, QString before, QString after);
  270. /**
  271. * @brief isContainInfoFormat 判断是否包含格式化信息
  272. * @return 包含与否
  273. */
  274. static bool isContainInfoFormat(QString mInfoFormat = "");
  275. /**
  276. * @brief printSystemLog 打印日志系统自身的提示信息
  277. * @param level 级别(普通info,警告warn,错误error)
  278. * @param msg 信息
  279. * @return
  280. */
  281. static void printSystemLog(QString level, QString msg);
  282. };
  283. #endif // LOG_H