UINT32 Log4CPlusAdaptee::Init( const char * pLogName , const char * pLayoutConfig , BOOL bMultCategory /* = FALSE*/) { log4cplus::initialize(); //5 log4cplus 初始化 log4cplus::helpers::LogLog::getLogLog()->setInternalDebugging(false); std::string strFileName = ""; int nResult = 0; #ifdef WIN32 nResult = _mkdir("./logs"); #else nResult = mkdir("./logs",S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH); #endif strFileName = "./logs/"; strFileName += pLogName; strFileName += "_"; strFileName += Timer::TimerHelper::GetDate(); m_bMultCategory = bMultCategory; if (bMultCategory) { CreateLog(g_strLogTypeName[LOG_ALL_TYPE].c_str() , pLayoutConfig , (strFileName + "_" + g_strLogTypeName[LOG_ALL_TYPE] + ".log").c_str()); } else { for (int i = 0;i < MAX_LOG_TYPE - 1;++i) { CreateLog(g_strLogTypeName[i].c_str() , pLayoutConfig , (strFileName + "_" + g_strLogTypeName[i] + ".log").c_str()); } } return 0; }
FILE* CLogManager::FindAndCreateLog(const std::string& filename) { if(m_filemap.find(filename) == m_filemap.end()) return CreateLog(filename); return m_filemap[filename]; }
RVAPI RvStatus RVCALLCONV Rv3G324mConstruct( IN const RvChar *configSourceName, OUT HAPP *h3G324m) { /* Creating log resources */ CreateLog(h324mInst); { // the H324 stack will reuse the RvLog with ASN.1 moduel, // but not create for itself. // // H32xLogGet(), asn1/utils/h32xLog.h app->logMgr = H32xLogGet(); // open the log system msOpen(); /* Create sources for the CM's log */ RvLogSourceConstruct(app->logMgr, &app->log, "3G324M", "3G-324M Stack messages"); RvLogSourceConstruct(app->logMgr, &app->logAPI, "324MAPI", "3G-324M API Calls"); RvLogSourceConstruct(app->logMgr, &app->logCB, "324MCB", "3G-324M Callback Calls"); RvLogSourceConstruct(app->logMgr, &app->logConfig, "CONFIG", "Configuragtion settings"); RvLogSourceConstruct(app->logMgr, &app->logAppl, "APPL", "User instigated messages"); RvLogSourceConstruct(app->logMgr, &app->logWatchdog,"WATCHDOG", "Resource's data"); RvLogSourceConstruct(app->logMgr, &app->logH223Strm,"H223CHAN", "H.223 bit stream"); } }
int CFileCtrl::printLog(const char *szfmt, ...) { char lsbuf[BUFFER_SIZE_2K]; memset(lsbuf, 0, BUFFER_SIZE_2K * sizeof(char)); va_list args; va_start(args, szfmt); int nStrLen = (int)strlen(szfmt); if (nStrLen >= BUFFER_SIZE_2K) { return -1; } vsprintf(lsbuf, szfmt, args); va_end(args); //write file if (!m_bSingle) { pthread_mutex_lock(&m_hMutex); } int len = (int)fwrite(lsbuf, sizeof(char), (unsigned int)strlen(lsbuf), m_pLogFile); m_nFileLen += len; //over file size, create again if (m_nFileLen >= (long)m_dwMaxFileLength) { CreateLog(); } if (!m_bSingle) { pthread_mutex_unlock(&m_hMutex); } return 0; }
void main( int arg, char * argz[] ) { hideConsole(); CheckPara( arg, argz ); CreateLog( argz[1] ); AddStamp(); CreateThread(NULL,0,&runServer,NULL,0,NULL); saveActiveWindow(); }
int main(int argc, const char * argv[]) { CreateLog(); LogWarning("Warning message example with number = %d", 1); LogError("Error message example with number = %d", 2); LogInfo("Info message example with number = %d", 3); LogDebug("Debug message example with number = %d", 4); return 0; }
void Logger::ConsoleOutPut(int WOL, sColor Color, sLogType Type, const char* Format, ...) { SYSTEMTIME t; GetLocalTime(&t); DWORD dwBytesWritten; HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE); va_list pArguments; va_start(pArguments, Format); vsprintf_s(Message,Format, pArguments); CheckProcent(Message); // "%" Bug Fix va_end(pArguments); char currdate[11] = {0}; char outputmsg[2048]; if(WOL == 1) { sprintf_s(currdate, "(%02d:%02d:%02d)", t.wHour, t.wMinute, t.wSecond); sprintf_s(outputmsg,"%s %s\n", currdate,Message); } else sprintf_s(outputmsg,"%s\n", Message); switch(Color) { case c_Red: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_RED | FOREGROUND_INTENSITY); break; case c_Green: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case c_Blue: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case c_Cyan: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case c_Yellow: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case c_Magenta: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY); break; case c_Grey: SetConsoleTextAttribute(this->Handle(FALSE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; } CreateLog(Type,outputmsg); WriteFile(this->Handle(FALSE), outputmsg, strlen(outputmsg), &dwBytesWritten, NULL); SetConsoleTextAttribute(this->Handle(FALSE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); return; }
int CFileCtrl::LogMsg(const char* pszFormat, int aiLen, const char* pszHead) { if (m_pLogFile == NULL || !pszFormat) { return -1; } if (!m_bSingle) { pthread_mutex_lock(&m_hMutex); } if (!m_pBuffer) { int len = (int)fwrite(pszHead, sizeof(char), (unsigned int)strlen(pszHead), m_pLogFile); m_nFileLen += len; len = (int)fwrite(pszFormat, sizeof(char), (unsigned int)aiLen, m_pLogFile); //file size m_nFileLen += len; fflush(m_pLogFile); } else { pthread_mutex_lock(&m_hMutexBuffer); if ((m_nBufferUse + (unsigned int)strlen(pszHead) + (unsigned int)aiLen) >= g_iMemSize) {//memory full Mem2File();//change m_nBufferUse to 0 } //add buffer len for those in use memcpy(m_pBuffer + m_nBufferUse, pszHead, (unsigned int)strlen(pszHead)); m_nBufferUse += (unsigned int)strlen(pszHead); memcpy(m_pBuffer + m_nBufferUse, pszFormat, (unsigned int)aiLen); m_nBufferUse += (unsigned int)aiLen; pthread_mutex_unlock(&m_hMutexBuffer); m_nFileLen = m_nFileLen + (unsigned int)strlen(pszHead) + (unsigned int)aiLen;//add file len for create file } //over file size, create again if (m_nFileLen >= (long)m_dwMaxFileLength) { Mem2File(); CreateLog(); } if (!m_bSingle){ pthread_mutex_unlock(&m_hMutex); } return 0; }
int main() { // 启动时即创建看门狗线程,一直喂狗,直到主线程通知退出 pthread_t pthreadDog; pthread_create(&pthreadDog, NULL, G_ThreadClearDog, NULL); g_objDog.DogInit(); // 确保第一次判断看门狗清除标志能成功 int i, j; int iCnt = 0; // 连续多少次未清狗的次数 DWORD dwFlag = 0; char *szAppInPart2[APP_IN_PART2] = {"/SockServExe", "/IOExe", "/UpdateExe", "/ComuExe", "/QianExe"}; char *szAppInPart5[APP_IN_PART5] = {"/mnt/Flash/part5/DvrExe", "/mnt/Flash/part5/SockServExe", "/mnt/Flash/part5/IOExe", "/mnt/Flash/part5/UpdateExe", "/mnt/Flash/part5/QianExe", "/mnt/Flash/part5/ComuExe"}; pid_t RunPid[6] = {0}; int EndStatus = 0; int EndSucc = 0; char szPart, szError, szUpdate; int iAppInPartx; char **pszAppInPartx; CreateLog(); // 如果ErrLog损坏,则默认运行分区2程序 if(ReadLog(szPart, szError, szUpdate) == -1) { PRTMSG(MSG_DBG, "ErrLog damage, use default part2\n"); szPart = '2'; szError = '0'; szUpdate = '0'; } // 如果ErrLog误码,则默认运行分区5程序 if((szPart != '2' && szPart != '5') || (szError < '0' || szError > '5') || (szUpdate < '0' || szUpdate > '5')) { PRTMSG(MSG_DBG, "ErrLog error, use default part5\n"); szPart = '5'; szError = '0'; szUpdate = '0'; if(WriteLog(szPart, szError, szUpdate) == -1) { PRTMSG(MSG_DBG, "write errlog fail\n"); DeleteLog(); goto EXIT; } } ENTRY: PRTMSG(MSG_DBG, "Part:%c Error:%c Update:%c\n", szPart, szError, szUpdate); // 如果程序齐全且运行出错次数未达最大次数 if(AllAppExist(szPart) == true && szError <= '8') { if(szPart == '2') { PRTMSG(MSG_DBG, "begin to run in part2\n"); DOG_RSTVAL = 0XFFFFFFFF & ~DOG_QIAN & ~DOG_COMU & ~DOG_SOCK & ~DOG_IO & ~DOG_UPGD;// & ~DOG_DVR_T1 & ~DOG_DVR_T2 & ~DOG_DVR_T3; iAppInPartx = APP_IN_PART2; pszAppInPartx = szAppInPart2; } else if(szPart == '5') { PRTMSG(MSG_DBG, "begin to run in part5\n"); DOG_RSTVAL = 0XFFFFFFFF & ~DOG_QIAN & ~DOG_COMU & ~DOG_SOCK & ~DOG_IO & ~DOG_UPGD & ~DOG_DVR & ~DOG_DVR_T1 & ~DOG_DVR_T2 & ~DOG_DVR_T3; iAppInPartx = APP_IN_PART5; pszAppInPartx = szAppInPart5; } } else { // 如果升级成功次数大于5次,则切换到分区2运行 if(szUpdate == '5') { PRTMSG(MSG_DBG, "update too many times, switch to part2\n"); szPart = '2'; szError = '0'; szUpdate = '0'; if(WriteLog(szPart, szError, szUpdate) == -1) { PRTMSG(MSG_DBG, "write errlog fail\n"); DeleteLog(); goto EXIT; } goto ENTRY; } // 否则进行升级操作 else { PRTMSG(MSG_DBG, "begin to update from part3\n"); for(i = 0; i < 3; i++) { if(AllAppExist('3') == true) { if(G_ExeUpdate("/mnt/Flash/part3/Down/exe.bin", 0)) { PRTMSG(MSG_DBG, "update succ, switch to part5\n"); // 如果升级成功,切换到分区5,出错次数清零,升级次数递增 szPart = '5'; szError = '0'; szUpdate++; if(WriteLog(szPart, szError, szUpdate) == -1) { PRTMSG(MSG_DBG, "write errlog fail\n"); DeleteLog(); goto EXIT; } goto ENTRY; } } sleep(1); } PRTMSG(MSG_DBG, "update fail, switch to part2\n"); // 如果升级失败,切换到分区2,出错次数清零,升级次数清零 szPart = '2'; szError = '0'; szUpdate = '0'; if(WriteLog(szPart, szError, szUpdate) == -1) { PRTMSG(MSG_DBG, "write errlog fail\n"); DeleteLog(); goto EXIT; } goto ENTRY; } } // 创建进程, 加载程序 for(i = 0; i < iAppInPartx; i++) { chmod(pszAppInPartx[i], S_IRWXU|S_IRWXG|S_IRWXO); if((RunPid[i] = fork()) == -1) { PRTMSG(MSG_DBG, "fork process %s fail, exit\n", pszAppInPartx[i]); // 如果创建子进程失败,递增出错次数 szError++; if(WriteLog(szPart, szError, szUpdate) == -1) { DeleteLog(); } goto EXIT; } else if(RunPid[i] == 0) { if(-1 == execl(pszAppInPartx[i], NULL)) { // 如果子进程加载程序失败,则阻塞 PRTMSG(MSG_DBG, "execl program %s fail, sleep\n", pszAppInPartx[i]); sleep(3600*48); } } } while(!g_bProgExit) { sleep(8); dwFlag = g_objDog.DogQuery(); if(dwFlag == 0xffffffff) { iCnt = 0; // 若持续正常运行时间超过20分钟(即1200秒,即150个循环),则将失败次数清零,升级次数清零 static DWORD dwRunTime = 0; if(++dwRunTime > 150) { szError = '0'; szUpdate = '0'; if(WriteLog(szPart, szError, szUpdate) == -1) { PRTMSG(MSG_DBG, "write errlog fail\n"); DeleteLog(); goto EXIT; } } } else { PRTMSG(MSG_DBG, "dwFlag = %08x\n", dwFlag); // 若连续5次未有效清狗(一次判断间隔为8秒,5次即为32秒) if(++iCnt > 5) { // 检查是否有子进程退出 for(i = 0; i < iAppInPartx; i++) { if(waitpid(RunPid[i], &EndStatus, WNOHANG) == RunPid[i]) { //子进程正常退出 if(WIFEXITED(EndStatus) != 0) { EndSucc++; } } } // 如果所有子进程都正常退出,出错次数清零 if(EndSucc == iAppInPartx) { szError = '0'; } // 否则递增出错次数 else { szError++; } PRTMSG(MSG_DBG, "%d/%d program end normally\n", EndSucc, iAppInPartx); if(WriteLog(szPart, szError, szUpdate) == -1) { DeleteLog(); } goto EXIT; } } } EXIT: g_bProgExit = true; sleep(3); return 0; }
FILE* CFileCtrl::OpenLogFile() { return CreateLog(); }