// CkLog.h: interface for the CkLog class. #ifndef CKLOG_H #define CKLOG_H #define CMBLOG4 //是否使用招行日志库开关 //#define CKLOG //是否使用公司日志库开关 #include #include #include #include #include #include #include //#include #include #include #include #include #include #include #include #include #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