CkLog.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. // CkLog.h: interface for the CkLog class.
  2. #ifndef CKLOG_H
  3. #define CKLOG_H
  4. #define CMBLOG4 //是否使用招行日志库开关
  5. //#define CKLOG //是否使用公司日志库开关
  6. #include <stdio.h>
  7. #include <fstream>
  8. #include <string>
  9. #include <iostream>
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <unistd.h>
  13. //#include <thread>
  14. #include <stdarg.h>
  15. #include <ctime>
  16. #include <time.h>
  17. #include <sys/time.h>
  18. #include <pthread.h>
  19. #include <sys/prctl.h>
  20. #include <sys/syscall.h>
  21. #include <dlfcn.h>
  22. #include "wintypes.h"
  23. #if defined(CMBLOG4)
  24. #include "log4vendor.h"
  25. #endif
  26. #if defined(CKLOG)
  27. #include "CommDef.h"
  28. #include "TraceManager.h"
  29. #endif
  30. using namespace std;
  31. //#ifdef __cplusplus
  32. //extern "C" {
  33. //#endif
  34. /* 字节对齐设置为1 */
  35. //#pragma pack(push,1)
  36. #define TRACE_LEN (MAXWORD / 2)
  37. #ifndef __linux__
  38. #include "windows.h"
  39. #define GetProcessId() GetCurrentProcessId()
  40. #define GetThreadId() GetCurrentThreadId()
  41. #else
  42. //名字的长度最大为15字节,且应该以'\0'结尾 prctl(PR_SET_NAME, (char*)arg);
  43. #define set_thread_name(name) prctl(PR_SET_NAME, (char*)name)
  44. //prctl(PR_GET_NAME, (unsigned long)name);
  45. #define get_thread_name(name) prctl(PR_GET_NAME, (unsigned long)name)
  46. //或者使用 PID= syscall(__NR_getpid)
  47. #define GetProcessId() getpid()
  48. //或者使用 TID= syscall(SYS_gettid)
  49. #define GetThreadId() syscall(__NR_gettid)
  50. #endif
  51. //获取完整路径中的文件名称
  52. std::string GetFileName(char* pstrFullPath);
  53. //获取当前程序所在路径和文件名
  54. bool GetCurModulePath(char* pstrLibPath, char* pstrLibName);
  55. int getFileVer(char* sFile, short &ch1, short &ch2);
  56. //加载so动态库
  57. void* LoadSO(char* pstrSOName);
  58. //获取指针
  59. void* GetPtr(void* pVoid=nullptr);
  60. //利用构造和析构记录函数进出类
  61. class CkLog_FuncTracer
  62. {
  63. public:
  64. static bool m_bCkLogExtendInf;
  65. CkLog_FuncTracer(const char* pszFunc, const char* pszFile, int nLine, void* pfRet, int iSize);
  66. ~CkLog_FuncTracer();
  67. private:
  68. char m_pszFunc[256];
  69. char m_pszFile[256];
  70. int m_nLine;
  71. short* m_psfRet; //INT16
  72. int* m_pifRet; //INT32
  73. long* m_plfRet; //INT64
  74. };
  75. //declare
  76. //CMB日志声明,暂未用到
  77. #if defined(CMBLOG4)
  78. #define CMBLOG4_DECLARE()
  79. #else
  80. #define CMBLOG4_DECLARE()
  81. #endif
  82. //CK日志声明
  83. #if defined(CKLOG)
  84. #define CKLOG_DECLARE() \
  85. CTraceManager *pLOG;
  86. #else
  87. #define CKLOG_DECLARE()
  88. #endif
  89. //initialize
  90. //CMB日志初始化
  91. #if defined(CMBLOG4)
  92. #define CMBLOG4_INIT(modName, logPath, fileName) \
  93. do { \
  94. std::string err_msg=""; \
  95. cmb::log4vendor::instance(); \
  96. cmb::log_init_config config_mod; \
  97. config_mod.dev_name = modName; \
  98. config_mod.log_type = CMB_LOG_TYPE_FILE; \
  99. config_mod.log_dir = logPath; \
  100. cmb::log4vendor::init(config_mod, err_msg); \
  101. } while (0);
  102. #else
  103. #define CMBLOG4_INIT(modName, logPath, fileName)
  104. #endif
  105. //CMB日志初始化2
  106. #if defined(CMBLOG4)
  107. #define CMBLOG4_INIT_P(modName, logPath, fileName) \
  108. do { \
  109. char err_msg[VENDOR_BUFF_SIZE] = { '\0' }; \
  110. cmb::log4vendor::instance(); \
  111. cmb::log_init_config_c config_mod; \
  112. strcpy(config_mod.dev_name, modName); \
  113. config_mod.log_type = CMB_LOG_TYPE_FILE; \
  114. strcpy(config_mod.log_dir, logPath); \
  115. cmb::log4vendor::initp(&config_mod, err_msg); \
  116. } while (0);
  117. #else
  118. #define CMBLOG4_INIT_P(modName, logPath, fileName)
  119. #endif
  120. //CK日志初始化
  121. #if defined(CKLOG)
  122. #define CKLOG_INIT(modName, logPath, fileName) \
  123. pLOG = new CTraceManager(); \
  124. pLOG->Register(fileName);
  125. #else
  126. #define CKLOG_INIT(modName, logPath, fileName)
  127. #endif
  128. //EXTERN
  129. //CK日志扩展声明
  130. #if defined(CKLOG)
  131. #define CKLOG_EXTERN() \
  132. extern CTraceManager *pLOG;
  133. #else
  134. #define CKLOG_EXTERN()
  135. #endif
  136. //CMB 的函数进出记录功能
  137. #if defined(CMBLOG4)
  138. #define CMBLOG4_FUNCTION() \
  139. LOG4VTM_FUNCTION();
  140. #else
  141. #define CMBLOG4_FUNCTION()
  142. #endif
  143. //CMB的函数进出和INT32返回值记录功能
  144. #if defined(CMBLOG4)
  145. #define CMBLOG4_FUNCTION_INT32(RetVar) \
  146. cmb::log4vendor_tracer _FunctionLoggerCMB(__FUNCTION__, cmb::log4vendor_tracer::_get_file_name(__FILE__), __LINE__, (int*)GetPtr(RetVar));
  147. #else
  148. #define CMBLOG4_FUNCTION_INT32(RetVar)
  149. #endif
  150. //CMB的函数进出和INT64返回值记录功能
  151. #if defined(CMBLOG4)
  152. #define CMBLOG4_FUNCTION_INT64(RetVar) \
  153. cmb::log4vendor_tracer _FunctionLoggerCMB(__FUNCTION__, cmb::log4vendor_tracer::_get_file_name(__FILE__), __LINE__, (long*)GetPtr(RetVar));
  154. #else
  155. #define CMBLOG4_FUNCTION_INT64(RetVar)
  156. #endif
  157. //CK的函数进出记录功能
  158. #if defined(CKLOG)
  159. #define CKLOG_FUNCTION() \
  160. CkLog_FuncTracer _FunctionLoggerCK(__FUNCTION__, GetFileName(__FILE__).c_str(), __LINE__, nullptr, 0);
  161. #else
  162. #define CKLOG_FUNCTION()
  163. #endif
  164. //CK的函数进出和INT返回值记录功能
  165. #if defined(CKLOG)
  166. #define CKLOG_FUNCTION_INT(RetVar) \
  167. CkLog_FuncTracer _FunctionLoggerCK(__FUNCTION__, GetFileName(__FILE__).c_str(), __LINE__, GetPtr(&RetVar), sizeof(RetVar));
  168. #else
  169. #define CKLOG_FUNCTION_INT(RetVar)
  170. #endif
  171. //CMB 记录普通日志
  172. #if defined(CMBLOG4)
  173. #define LOG_CMBLOG4(logLevel, ...) \
  174. do { \
  175. int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__); \
  176. char CkLog_Buf[512 + iCkLog_BufLen]; \
  177. memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf)); \
  178. if(CkLog_FuncTracer::m_bCkLogExtendInf) \
  179. snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>: ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__); \
  180. else \
  181. snprintf(CkLog_Buf, sizeof(CkLog_Buf), " : "); \
  182. snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__); \
  183. LOG4VTM(logLevel, CkLog_Buf); \
  184. } while (0);
  185. #else
  186. #define LOG_CMBLOG4(logLevel, ...)
  187. #endif
  188. //CMB 记录bin日志
  189. #if defined(CMBLOG4)
  190. #define LOGX_CMBLOG4(logLevel, pData, Len, ...) \
  191. do { \
  192. std::string strCkLog_Data=""; \
  193. std::string strCkLog_Tmp=""; \
  194. int iCkLog_useLen=0, iCkLog_restLen=(int)Len; \
  195. int iCkLog_printLen, iCkLog_i; \
  196. unsigned char* CkLog_p = nullptr; \
  197. char CkLog_TmpBuf[256]; \
  198. int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__); \
  199. char CkLog_Buf[512 + iCkLog_BufLen]; \
  200. memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf)); \
  201. if(CkLog_FuncTracer::m_bCkLogExtendInf) \
  202. snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>:Len=[%d] ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__, (int)Len); \
  203. else \
  204. snprintf(CkLog_Buf, sizeof(CkLog_Buf), " :Len=[%d] ", (int)Len); \
  205. snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__); \
  206. sprintf(CkLog_Buf + strlen(CkLog_Buf), "\n"); \
  207. strCkLog_Data = CkLog_Buf; \
  208. if((int)Len > 0) \
  209. { \
  210. memset(CkLog_TmpBuf, 0x00, sizeof(CkLog_TmpBuf)); \
  211. for(iCkLog_i = 0; iCkLog_i <= 0xF; iCkLog_i++) sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "-%X-", iCkLog_i); \
  212. sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "\n"); \
  213. strCkLog_Tmp = CkLog_TmpBuf; \
  214. strCkLog_Data = strCkLog_Data + strCkLog_Tmp; \
  215. while( iCkLog_restLen > 0 ) \
  216. { \
  217. CkLog_p = (unsigned char*)pData + iCkLog_useLen; \
  218. iCkLog_printLen = iCkLog_restLen<16 ? iCkLog_restLen : 16; \
  219. memset(CkLog_TmpBuf, 0x00, sizeof(CkLog_TmpBuf)); \
  220. for(iCkLog_i=0; iCkLog_i < iCkLog_printLen; iCkLog_i++) sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "%02x ", *(CkLog_p + iCkLog_i)); \
  221. sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "\n"); \
  222. strCkLog_Tmp = CkLog_TmpBuf; \
  223. strCkLog_Data = strCkLog_Data + strCkLog_Tmp; \
  224. iCkLog_useLen += iCkLog_printLen; \
  225. iCkLog_restLen -= iCkLog_printLen; \
  226. } \
  227. } \
  228. LOG4VTM(logLevel, strCkLog_Data.c_str()); \
  229. } while (0);
  230. #else
  231. #define LOGX_CMBLOG4(logLevel, pData, Len, ...)
  232. #endif
  233. //CK 记录普通日志功能
  234. //bool TraceInFormat( int nType, int nLevel, char* lpszTraceData, ... );
  235. #if defined(CKLOG)
  236. #define LOG_CKLOG(logLevel, ...) \
  237. do { \
  238. int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__); \
  239. char CkLog_Buf[512 + iCkLog_BufLen]; \
  240. memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf)); \
  241. if(CkLog_FuncTracer::m_bCkLogExtendInf) \
  242. snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>: ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__); \
  243. else \
  244. snprintf(CkLog_Buf, sizeof(CkLog_Buf), " : "); \
  245. snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__); \
  246. pLOG->TraceInFormat(TRM_INT, logLevel, "%s", CkLog_Buf); \
  247. } while (0);
  248. #else
  249. #define LOG_CKLOG(logLevel, ...)
  250. #endif
  251. //CK 记录bin日志功能
  252. //bool TraceInBuffer( int nType, int nLevel, unsigned char* lpbyTraceData, unsigned int uDataLen, char* lpszMsg = NULL,
  253. //unsigned int* lpuMaskOffsetArray = NULL, unsigned int* lpuMaskLenArray = NULL, unsigned int uMaskCnt = 0 );
  254. #if defined(CKLOG)
  255. #define LOGX_CKLOG(logLevel, pData, Len, ...) \
  256. do { \
  257. int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__); \
  258. char CkLog_Buf[512 + iCkLog_BufLen]; \
  259. memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf)); \
  260. if(CkLog_FuncTracer::m_bCkLogExtendInf) \
  261. snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>: ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__); \
  262. else \
  263. snprintf(CkLog_Buf, sizeof(CkLog_Buf), " : "); \
  264. snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__); \
  265. pLOG->TraceInBuffer(TRM_INT, logLevel, (unsigned char*)pData, (unsigned int)Len, CkLog_Buf); \
  266. } while (0);
  267. #else
  268. #define LOGX_CKLOG(logLevel, pData, Len, ...)
  269. #endif
  270. /*
  271. #define CMB_LOG_TRACE 1
  272. #define CMB_LOG_DEBUG 2
  273. #define CMB_LOG_INFO 3
  274. #define CMB_LOG_WARN 4
  275. #define CMB_LOG_ERROR 5
  276. #define CMB_LOG_FATAL 6
  277. */
  278. /*
  279. #define TRM_LV_COMMN (0x0001)
  280. #define TRM_LV_WARNG (0x0002)
  281. #define TRM_LV_ERROR (0x0004)
  282. #define TRM_LV_DEBUG (0x0008)
  283. */
  284. /*记录日志入口函数 Start*/
  285. //declare
  286. //CMB和CK 日志声明入口
  287. #define LOG_DECLARE() \
  288. CMBLOG4_DECLARE() \
  289. CKLOG_DECLARE()
  290. //initialize
  291. //CMB和CK 日志初始化入口
  292. #define LOG_INIT(modName, logPath, fileName) \
  293. CMBLOG4_INIT(modName, logPath, fileName) \
  294. CKLOG_INIT(modName, logPath, fileName)
  295. //CMB和CK 日志初始化入口2
  296. #define LOG_INIT_P(modName, logPath, fileName) \
  297. CMBLOG4_INIT_P(modName, logPath, fileName) \
  298. CKLOG_INIT(modName, logPath, fileName)
  299. //CMB和CK 日志扩展声明
  300. #define LOG_EXTERN() \
  301. CKLOG_EXTERN()
  302. //CMB和CK 记录进出函数信息日志入口
  303. #define LOG_FUNCTION() \
  304. CMBLOG4_FUNCTION() \
  305. CKLOG_FUNCTION()
  306. //CK 记录进出函数信息和short返回值 日志入口
  307. #define LOG_FUNCTION_INT16(RetVar) \
  308. CKLOG_FUNCTION_INT(RetVar)
  309. //CMB和CK 记录进出函数信息和int返回值 日志入口
  310. #define LOG_FUNCTION_INT32(RetVar) \
  311. CMBLOG4_FUNCTION_INT32(&RetVar) \
  312. CKLOG_FUNCTION_INT(RetVar)
  313. //CMB和CK 记录进出函数信息和long返回值 日志入口
  314. #define LOG_FUNCTION_INT64(RetVar) \
  315. CMBLOG4_FUNCTION_INT64(&RetVar) \
  316. CKLOG_FUNCTION_INT(RetVar)
  317. //CMB和CK 记录普通错误日志入口
  318. #define LogE(...) \
  319. do { \
  320. LOG_CMBLOG4(ERROR, ## __VA_ARGS__) \
  321. LOG_CKLOG(TRM_LV_ERROR, ## __VA_ARGS__) \
  322. } while (0);
  323. //CMB和CK 记录普通警告日志入口
  324. #define LogW(...) \
  325. do { \
  326. LOG_CMBLOG4(WARN, ## __VA_ARGS__) \
  327. LOG_CKLOG(TRM_LV_WARNG, ## __VA_ARGS__) \
  328. } while (0);
  329. //CMB和CK 记录普通一般信息日志入口
  330. #define LogM(...) \
  331. do { \
  332. LOG_CMBLOG4(INFO, ## __VA_ARGS__) \
  333. LOG_CKLOG(TRM_LV_COMMN, ## __VA_ARGS__) \
  334. } while (0);
  335. //CMB和CK 记录普通调试信息日志入口
  336. #define LogD(...) \
  337. do { \
  338. LOG_CMBLOG4(DEBUG, ## __VA_ARGS__) \
  339. LOG_CKLOG(TRM_LV_DEBUG, ## __VA_ARGS__) \
  340. } while (0);
  341. /*
  342. #define TRM_LV_COMMN (0x0001)
  343. #define TRM_LV_WARNG (0x0002)
  344. #define TRM_LV_ERROR (0x0004)
  345. #define TRM_LV_DEBUG (0x0008)
  346. */
  347. //CMB和CK 记录bin(HEX表示)数据 错误级别 日志入口
  348. #define LogXE(pData, Len, ...) \
  349. do { \
  350. LOGX_CMBLOG4(ERROR, pData, Len, ## __VA_ARGS__) \
  351. LOGX_CKLOG(TRM_LV_ERROR, pData, Len, ## __VA_ARGS__) \
  352. } while (0);
  353. //CMB和CK 记录bin(HEX表示)数据 警告级别 日志入口
  354. #define LogXW(pData, Len, ...) \
  355. do { \
  356. LOGX_CMBLOG4(WARN, pData, Len, ## __VA_ARGS__) \
  357. LOGX_CKLOG(TRM_LV_WARNG, pData, Len, ## __VA_ARGS__) \
  358. } while (0);
  359. //CMB和CK 记录bin(HEX表示)数据 一般信息级别 日志入口
  360. #define LogXM(pData, Len, ...) \
  361. do { \
  362. LOGX_CMBLOG4(INFO, pData, Len, ## __VA_ARGS__) \
  363. LOGX_CKLOG(TRM_LV_COMMN, pData, Len, ## __VA_ARGS__) \
  364. } while (0);
  365. //CMB和CK 记录bin(HEX表示)数据 调试信息级别 日志入口
  366. #define LogXD(pData, Len, ...) \
  367. do { \
  368. LOGX_CMBLOG4(DEBUG, pData, Len, ## __VA_ARGS__) \
  369. LOGX_CKLOG(TRM_LV_DEBUG, pData, Len, ## __VA_ARGS__) \
  370. } while (0);
  371. /*记录日志入口函数 End*/
  372. /* 恢复字节对齐方式 */
  373. //#pragma pack(pop)
  374. //#ifdef __cplusplus
  375. //} /*extern "C"*/
  376. //#endif
  377. #endif