最近在做遊戲開發,閱讀了一些源碼後做了一些總結與記錄,希望對自己和其他的朋友有所協助。軟體開發中常常將關鍵的操作、一般性警告以及嚴重的錯誤,通過字串的形式輸出至記錄檔,本子系統實現bootlog,debuglog,warning,fatallog等輸出形式,支援多線程。有不到之處歡迎指正,交流。email:caohaitao_linux@163.com
LoLog日誌系統關鍵知識:
1.檔案操作
2.擷取目前時間的字串
3.變參函數的處理
LoLog組成要素:
1.檔案指標
2.檔案狀態(可省)
3.互斥鎖
註:檔案狀態可以通過判斷檔案指標是否為空白來獲得,但此過程使用頻繁,以函數調用形式會使得壓棧彈、棧操作過多。static int佔用空間較少,變數見名知意使用方便,最好不要省略檔案狀態變數
UML圖:
檔案開啟操作
int LoLogs::OpenLog(const char *pcLogLead){int nRet = 0;if(m_nFileStatus == FILESTATUS_CLOSE){char szOpenPathName[MAXSIZE_PATHNAME] = {0};time_tltime;tmtmStruct;time(<ime);tmStruct = *localtime(<ime);strcat(szOpenPathName, SUBDIRNAME_LOG);sprintf(szOpenPathName + strlen(szOpenPathName), "%s%04d-%02d-%02d.log",pcLogLead, tmStruct.tm_year+1900,tmStruct.tm_mon+1,tmStruct.tm_mday);#ifdef WIN32CreateDirectory(SUBDIRNAME_LOG, NULL);#else /* LINUX */mkdir(SUBDIRNAME_LOG, 0700);#endifm_fileSvrLog = fopen(szOpenPathName, "a+");if(m_fileSvrLog) {m_nFileStatus = FILESTATUS_OPEN;}else{nRet = -1;}}return nRet;}
擷取目前時間的字串
// CLogs class member functionsconst char *LoLogs::GetCurDateTimeWithString(char *pStringBuf){time_ttCurDateTime;tm*ptagCurDataTime;charszTimeStringBuf[MAXSIZE_TIMESTRING] = {0};char *pWriteStringBuf = pStringBuf;if(NULL == pWriteStringBuf){pWriteStringBuf = szTimeStringBuf;}time(&tCurDateTime);ptagCurDataTime = localtime(&tCurDateTime);sprintf(pWriteStringBuf, "%d-%02d-%02d %02d:%02d:%02d", ptagCurDataTime->tm_year+1900, ptagCurDataTime->tm_mon+1, ptagCurDataTime->tm_mday, ptagCurDataTime->tm_hour, ptagCurDataTime->tm_min, ptagCurDataTime->tm_sec);return pWriteStringBuf;}
變參函數的處理
void LoLogs::WriteLog(const char *pcLogMsg, ...){char szMsgBuf[MAXSIZE_MSGBUF] = {0};va_list va;va_start(va, pcLogMsg);vsprintf(szMsgBuf, pcLogMsg, va);#ifdef WIN32printf( szMsgBuf );#endifva_end(va);WriteLogInner(szMsgBuf, LOGLEADNAME_BOOT);}
c++實現日誌系統源碼