123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- // CkLog.h: interface for the CkLog class.
- #ifndef CKLOG_H
- #define CKLOG_H
- #define CMBLOG4 //是否使用招行日志库开关
- //#define CKLOG //是否使用公司日志库开关
- #include <stdio.h>
- #include <fstream>
- #include <string>
- #include <iostream>
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <unistd.h>
- //#include <thread>
- #include <stdarg.h>
- #include <ctime>
- #include <time.h>
- #include <sys/time.h>
- #include <pthread.h>
- #include <sys/prctl.h>
- #include <sys/syscall.h>
- #include <dlfcn.h>
- #include "wintypes.h"
- #if defined(CMBLOG4)
- #include "log4vendor.h"
- #endif
- #if defined(CKLOG)
- #include "CommDef.h"
- #include "TraceManager.h"
- #endif
- using namespace std;
- //#ifdef __cplusplus
- //extern "C" {
- //#endif
- /* 字节对齐设置为1 */
- //#pragma pack(push,1)
- #define TRACE_LEN (MAXWORD / 2)
- #ifndef __linux__
- #include "windows.h"
- #define GetProcessId() GetCurrentProcessId()
- #define GetThreadId() GetCurrentThreadId()
- #else
- //名字的长度最大为15字节,且应该以'\0'结尾 prctl(PR_SET_NAME, (char*)arg);
- #define set_thread_name(name) prctl(PR_SET_NAME, (char*)name)
- //prctl(PR_GET_NAME, (unsigned long)name);
- #define get_thread_name(name) prctl(PR_GET_NAME, (unsigned long)name)
- //或者使用 PID= syscall(__NR_getpid)
- #define GetProcessId() getpid()
- //或者使用 TID= syscall(SYS_gettid)
- #define GetThreadId() syscall(__NR_gettid)
- #endif
- //获取完整路径中的文件名称
- std::string GetFileName(char* pstrFullPath);
- //获取当前程序所在路径和文件名
- bool GetCurModulePath(char* pstrLibPath, char* pstrLibName);
- //加载so动态库
- void* LoadSO(char* pstrSOName);
- //获取指针
- void* GetPtr(void* pVoid=nullptr);
- //利用构造和析构记录函数进出类
- class CkLog_FuncTracer
- {
- public:
- static bool m_bCkLogExtendInf;
- CkLog_FuncTracer(const char* pszFunc, const char* pszFile, int nLine, void* pfRet, int iSize);
- ~CkLog_FuncTracer();
- private:
- char m_pszFunc[256];
- char m_pszFile[256];
- int m_nLine;
- short* m_psfRet; //INT16
- int* m_pifRet; //INT32
- long* m_plfRet; //INT64
- };
- //declare
- //CMB日志声明,暂未用到
- #if defined(CMBLOG4)
- #define CMBLOG4_DECLARE()
- #else
- #define CMBLOG4_DECLARE()
- #endif
- //CK日志声明
- #if defined(CKLOG)
- #define CKLOG_DECLARE() \
- CTraceManager *pLOG;
- #else
- #define CKLOG_DECLARE()
- #endif
- //initialize
- //CMB日志初始化
- #if defined(CMBLOG4)
- #define CMBLOG4_INIT(modName, logPath, fileName) \
- do { \
- std::string err_msg=""; \
- cmb::log4vendor::instance(); \
- cmb::log_init_config config_mod; \
- config_mod.dev_name = modName; \
- config_mod.log_type = CMB_LOG_TYPE_FILE; \
- config_mod.log_dir = logPath; \
- cmb::log4vendor::init(config_mod, err_msg); \
- } while (0);
- #else
- #define CMBLOG4_INIT(modName, logPath, fileName)
- #endif
- //CMB日志初始化2
- #if defined(CMBLOG4)
- #define CMBLOG4_INIT_P(modName, logPath, fileName) \
- do { \
- char err_msg[VENDOR_BUFF_SIZE] = { '\0' }; \
- cmb::log4vendor::instance(); \
- cmb::log_init_config_c config_mod; \
- strcpy(config_mod.dev_name, modName); \
- config_mod.log_type = CMB_LOG_TYPE_FILE; \
- strcpy(config_mod.log_dir, logPath); \
- cmb::log4vendor::initp(&config_mod, err_msg); \
- } while (0);
- #else
- #define CMBLOG4_INIT_P(modName, logPath, fileName)
- #endif
- //CK日志初始化
- #if defined(CKLOG)
- #define CKLOG_INIT(modName, logPath, fileName) \
- pLOG = new CTraceManager(); \
- pLOG->Register(fileName);
- #else
- #define CKLOG_INIT(modName, logPath, fileName)
- #endif
- //EXTERN
- //CK日志扩展声明
- #if defined(CKLOG)
- #define CKLOG_EXTERN() \
- extern CTraceManager *pLOG;
- #else
- #define CKLOG_EXTERN()
- #endif
- //CMB 的函数进出记录功能
- #if defined(CMBLOG4)
- #define CMBLOG4_FUNCTION() \
- LOG4VTM_FUNCTION();
- #else
- #define CMBLOG4_FUNCTION()
- #endif
- //CMB的函数进出和INT32返回值记录功能
- #if defined(CMBLOG4)
- #define CMBLOG4_FUNCTION_INT32(RetVar) \
- cmb::log4vendor_tracer _FunctionLoggerCMB(__FUNCTION__, cmb::log4vendor_tracer::_get_file_name(__FILE__), __LINE__, (int*)GetPtr(RetVar));
- #else
- #define CMBLOG4_FUNCTION_INT32(RetVar)
- #endif
- //CMB的函数进出和INT64返回值记录功能
- #if defined(CMBLOG4)
- #define CMBLOG4_FUNCTION_INT64(RetVar) \
- cmb::log4vendor_tracer _FunctionLoggerCMB(__FUNCTION__, cmb::log4vendor_tracer::_get_file_name(__FILE__), __LINE__, (long*)GetPtr(RetVar));
- #else
- #define CMBLOG4_FUNCTION_INT64(RetVar)
- #endif
- //CK的函数进出记录功能
- #if defined(CKLOG)
- #define CKLOG_FUNCTION() \
- CkLog_FuncTracer _FunctionLoggerCK(__FUNCTION__, GetFileName(__FILE__).c_str(), __LINE__, nullptr, 0);
- #else
- #define CKLOG_FUNCTION()
- #endif
- //CK的函数进出和INT返回值记录功能
- #if defined(CKLOG)
- #define CKLOG_FUNCTION_INT(RetVar) \
- CkLog_FuncTracer _FunctionLoggerCK(__FUNCTION__, GetFileName(__FILE__).c_str(), __LINE__, GetPtr(&RetVar), sizeof(RetVar));
- #else
- #define CKLOG_FUNCTION_INT(RetVar)
- #endif
- //CMB 记录普通日志
- #if defined(CMBLOG4)
- #define LOG_CMBLOG4(logLevel, ...) \
- do { \
- int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__); \
- char CkLog_Buf[512 + iCkLog_BufLen]; \
- memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf)); \
- if(CkLog_FuncTracer::m_bCkLogExtendInf) \
- snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>: ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__); \
- else \
- snprintf(CkLog_Buf, sizeof(CkLog_Buf), " : "); \
- snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__); \
- LOG4VTM(logLevel, CkLog_Buf); \
- } while (0);
- #else
- #define LOG_CMBLOG4(logLevel, ...)
- #endif
- //CMB 记录bin日志
- #if defined(CMBLOG4)
- #define LOGX_CMBLOG4(logLevel, pData, Len, ...) \
- do { \
- std::string strCkLog_Data=""; \
- std::string strCkLog_Tmp=""; \
- int iCkLog_useLen=0, iCkLog_restLen=(int)Len; \
- int iCkLog_printLen, iCkLog_i; \
- unsigned char* CkLog_p = nullptr; \
- char CkLog_TmpBuf[256]; \
- int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__); \
- char CkLog_Buf[512 + iCkLog_BufLen]; \
- memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf)); \
- if(CkLog_FuncTracer::m_bCkLogExtendInf) \
- 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); \
- else \
- snprintf(CkLog_Buf, sizeof(CkLog_Buf), " :Len=[%d] ", (int)Len); \
- snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__); \
- sprintf(CkLog_Buf + strlen(CkLog_Buf), "\n"); \
- strCkLog_Data = CkLog_Buf; \
- if((int)Len > 0) \
- { \
- memset(CkLog_TmpBuf, 0x00, sizeof(CkLog_TmpBuf)); \
- for(iCkLog_i = 0; iCkLog_i <= 0xF; iCkLog_i++) sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "-%X-", iCkLog_i); \
- sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "\n"); \
- strCkLog_Tmp = CkLog_TmpBuf; \
- strCkLog_Data = strCkLog_Data + strCkLog_Tmp; \
- while( iCkLog_restLen > 0 ) \
- { \
- CkLog_p = (unsigned char*)pData + iCkLog_useLen; \
- iCkLog_printLen = iCkLog_restLen<16 ? iCkLog_restLen : 16; \
- memset(CkLog_TmpBuf, 0x00, sizeof(CkLog_TmpBuf)); \
- for(iCkLog_i=0; iCkLog_i < iCkLog_printLen; iCkLog_i++) sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "%02x ", *(CkLog_p + iCkLog_i)); \
- sprintf(CkLog_TmpBuf + strlen(CkLog_TmpBuf), "\n"); \
- strCkLog_Tmp = CkLog_TmpBuf; \
- strCkLog_Data = strCkLog_Data + strCkLog_Tmp; \
- iCkLog_useLen += iCkLog_printLen; \
- iCkLog_restLen -= iCkLog_printLen; \
- } \
- } \
- LOG4VTM(logLevel, strCkLog_Data.c_str()); \
- } while (0);
- #else
- #define LOGX_CMBLOG4(logLevel, pData, Len, ...)
- #endif
- //CK 记录普通日志功能
- //bool TraceInFormat( int nType, int nLevel, char* lpszTraceData, ... );
- #if defined(CKLOG)
- #define LOG_CKLOG(logLevel, ...) \
- do { \
- int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__); \
- char CkLog_Buf[512 + iCkLog_BufLen]; \
- memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf)); \
- if(CkLog_FuncTracer::m_bCkLogExtendInf) \
- snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>: ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__); \
- else \
- snprintf(CkLog_Buf, sizeof(CkLog_Buf), " : "); \
- snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__); \
- pLOG->TraceInFormat(TRM_INT, logLevel, "%s", CkLog_Buf); \
- } while (0);
- #else
- #define LOG_CKLOG(logLevel, ...)
- #endif
- //CK 记录bin日志功能
- //bool TraceInBuffer( int nType, int nLevel, unsigned char* lpbyTraceData, unsigned int uDataLen, char* lpszMsg = NULL,
- //unsigned int* lpuMaskOffsetArray = NULL, unsigned int* lpuMaskLenArray = NULL, unsigned int uMaskCnt = 0 );
- #if defined(CKLOG)
- #define LOGX_CKLOG(logLevel, pData, Len, ...) \
- do { \
- int iCkLog_BufLen = snprintf(NULL, 0, ## __VA_ARGS__); \
- char CkLog_Buf[512 + iCkLog_BufLen]; \
- memset(CkLog_Buf, 0x00, sizeof(CkLog_Buf)); \
- if(CkLog_FuncTracer::m_bCkLogExtendInf) \
- snprintf(CkLog_Buf, sizeof(CkLog_Buf), " Pid[%d],Tid[%d],{%s}[%d]<%s>: ", GetProcessId(), GetThreadId(), GetFileName(__FILE__).c_str(), __LINE__, __FUNCTION__); \
- else \
- snprintf(CkLog_Buf, sizeof(CkLog_Buf), " : "); \
- snprintf(CkLog_Buf + strlen(CkLog_Buf), iCkLog_BufLen+1, ## __VA_ARGS__); \
- pLOG->TraceInBuffer(TRM_INT, logLevel, (unsigned char*)pData, (unsigned int)Len, CkLog_Buf); \
- } while (0);
- #else
- #define LOGX_CKLOG(logLevel, pData, Len, ...)
- #endif
- /*
- #define CMB_LOG_TRACE 1
- #define CMB_LOG_DEBUG 2
- #define CMB_LOG_INFO 3
- #define CMB_LOG_WARN 4
- #define CMB_LOG_ERROR 5
- #define CMB_LOG_FATAL 6
- */
- /*
- #define TRM_LV_COMMN (0x0001)
- #define TRM_LV_WARNG (0x0002)
- #define TRM_LV_ERROR (0x0004)
- #define TRM_LV_DEBUG (0x0008)
- */
- /*记录日志入口函数 Start*/
- //declare
- //CMB和CK 日志声明入口
- #define LOG_DECLARE() \
- CMBLOG4_DECLARE() \
- CKLOG_DECLARE()
- //initialize
- //CMB和CK 日志初始化入口
- #define LOG_INIT(modName, logPath, fileName) \
- CMBLOG4_INIT(modName, logPath, fileName) \
- CKLOG_INIT(modName, logPath, fileName)
- //CMB和CK 日志初始化入口2
- #define LOG_INIT_P(modName, logPath, fileName) \
- CMBLOG4_INIT_P(modName, logPath, fileName) \
- CKLOG_INIT(modName, logPath, fileName)
- //CMB和CK 日志扩展声明
- #define LOG_EXTERN() \
- CKLOG_EXTERN()
- //CMB和CK 记录进出函数信息日志入口
- #define LOG_FUNCTION() \
- CMBLOG4_FUNCTION() \
- CKLOG_FUNCTION()
- //CK 记录进出函数信息和short返回值 日志入口
- #define LOG_FUNCTION_INT16(RetVar) \
- CKLOG_FUNCTION_INT(RetVar)
- //CMB和CK 记录进出函数信息和int返回值 日志入口
- #define LOG_FUNCTION_INT32(RetVar) \
- CMBLOG4_FUNCTION_INT32(&RetVar) \
- CKLOG_FUNCTION_INT(RetVar)
- //CMB和CK 记录进出函数信息和long返回值 日志入口
- #define LOG_FUNCTION_INT64(RetVar) \
- CMBLOG4_FUNCTION_INT64(&RetVar) \
- CKLOG_FUNCTION_INT(RetVar)
- //CMB和CK 记录普通错误日志入口
- #define LogE(...) \
- do { \
- LOG_CMBLOG4(ERROR, ## __VA_ARGS__) \
- LOG_CKLOG(TRM_LV_ERROR, ## __VA_ARGS__) \
- } while (0);
- //CMB和CK 记录普通警告日志入口
- #define LogW(...) \
- do { \
- LOG_CMBLOG4(WARN, ## __VA_ARGS__) \
- LOG_CKLOG(TRM_LV_WARNG, ## __VA_ARGS__) \
- } while (0);
- //CMB和CK 记录普通一般信息日志入口
- #define LogM(...) \
- do { \
- LOG_CMBLOG4(INFO, ## __VA_ARGS__) \
- LOG_CKLOG(TRM_LV_COMMN, ## __VA_ARGS__) \
- } while (0);
- //CMB和CK 记录普通调试信息日志入口
- #define LogD(...) \
- do { \
- LOG_CMBLOG4(DEBUG, ## __VA_ARGS__) \
- LOG_CKLOG(TRM_LV_DEBUG, ## __VA_ARGS__) \
- } while (0);
- /*
- #define TRM_LV_COMMN (0x0001)
- #define TRM_LV_WARNG (0x0002)
- #define TRM_LV_ERROR (0x0004)
- #define TRM_LV_DEBUG (0x0008)
- */
- //CMB和CK 记录bin(HEX表示)数据 错误级别 日志入口
- #define LogXE(pData, Len, ...) \
- do { \
- LOGX_CMBLOG4(ERROR, pData, Len, ## __VA_ARGS__) \
- LOGX_CKLOG(TRM_LV_ERROR, pData, Len, ## __VA_ARGS__) \
- } while (0);
- //CMB和CK 记录bin(HEX表示)数据 警告级别 日志入口
- #define LogXW(pData, Len, ...) \
- do { \
- LOGX_CMBLOG4(WARN, pData, Len, ## __VA_ARGS__) \
- LOGX_CKLOG(TRM_LV_WARNG, pData, Len, ## __VA_ARGS__) \
- } while (0);
- //CMB和CK 记录bin(HEX表示)数据 一般信息级别 日志入口
- #define LogXM(pData, Len, ...) \
- do { \
- LOGX_CMBLOG4(INFO, pData, Len, ## __VA_ARGS__) \
- LOGX_CKLOG(TRM_LV_COMMN, pData, Len, ## __VA_ARGS__) \
- } while (0);
- //CMB和CK 记录bin(HEX表示)数据 调试信息级别 日志入口
- #define LogXD(pData, Len, ...) \
- do { \
- LOGX_CMBLOG4(DEBUG, pData, Len, ## __VA_ARGS__) \
- LOGX_CKLOG(TRM_LV_DEBUG, pData, Len, ## __VA_ARGS__) \
- } while (0);
- /*记录日志入口函数 End*/
- /* 恢复字节对齐方式 */
- //#pragma pack(pop)
- //#ifdef __cplusplus
- //} /*extern "C"*/
- //#endif
- #endif
|