CkLog.h 14 KB

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