之前用的日誌記錄是阻塞式的,會影響主程式的執行。於是我決定自己擼乙個用訊息機制來記錄日誌的日誌類。
既然是要用訊息機制,肯定要有乙個訊息佇列,還要有乙個執行緒來不斷接收訊息,寫日誌。另外還需要使用單例類來管理日誌的記錄
首先來看主體**,run:
int clogbymsg::run()
clogparam logmsg = m_qlogmsg.front();
m_qlogmsg.pop();
fprintf(m_plogfile, "[%s][%s-%d] [%04d-%02d-%02d %02d:%02d:%02d.%d]\t\t%s \n",
logmsg.strfunction.c_str(),
logmsg.strfile.c_str(),
logmsg.lline,
logmsg.systime.wyear,
logmsg.systime.wmonth,
logmsg.systime.wday,
logmsg.systime.whour,
logmsg.systime.wminute,
logmsg.systime.wsecond,
logmsg.systime.wmilliseconds,
logmsg.strlog.c_str());
m_lcnt++;
if (m_lcnt % 20 == 0)
} return esucess;
}
**很簡單,就迴圈判斷訊息佇列是否為空,如果不為空則往檔案裡寫日誌。
如果日誌記錄已經超過了20條,則將檔案關閉一次,然後重新開啟。之所以要這樣是因為fclose檔案後,快取中的資料才會真正寫到硬碟中,這樣在程式執行期時,我們仍然看到日誌。
那如何往佇列裡新增訊息呢?用這兩個方法:
clogbymsg::eresult clogbymsg::writelog(const char* lpfile, const char * lpfunction ,long lline, const char* lplog)
int clogbymsg::sendlog(systemtime sys, const char* lpfile, const char * lpfunction, long lline, const char* lplog)
clogparam定義如下 :
class clogparam
;
包括記錄日誌的時間,檔案位置 ,函式等。
最後是呼叫。在這裡我們用巨集來完成日誌的初始化和記錄,原因我們後面講。
首先是日誌類的初始化,要呼叫:
#define log_create(pcpath) clogbymsg::getinstance()->create(pcpath)
pcpath就是日誌要儲存的位置。而create檔案要做的事也很簡單,將pcpath檔案開啟
釋放時呼叫
#define log_release() clogbymsg::getinstance()->release();
log_release會把日誌檔案關閉
如果要記錄日誌就呼叫
#define log_info(pclog) clogbymsg::getinstance()->writelog(__file__, __function__, __line__, pclog)
利用log_info來記錄,__file__, __function__, __line__,分別表示該行**所在的檔案,所屬於的函式,和該**在本**頁中的行數。這些資料將會在編譯時將這些資料作為char*型別引數輸入到writelog中。
而利用log_info巨集就避免了每次呼叫writelog時,都要輸入__file__, __function__, __line__這幾個引數,只要這樣使用就行了。
log_info("begin connect");
該日誌類還可以寫成dll,直接被呼叫。
具體可以看我的工程:基於訊息機制的日誌類
在裡面已經直接做成了dll,使用時,只要有logbymsg.dll和logbymsg.lib就行了。
基於訊息佇列的日誌元件
日誌支援的儲存方式有 文字,xml,資料庫三種。如果採用資料庫方式,支援的資料庫有sql server oracle。日誌採用讀寫分離的方式,客戶端傳送日誌到訊息佇列,然後服務端程式讀取訊息佇列,根據配置資訊,將訊息佇列中的日誌寫入載體 文字 xml 資料庫 如果採用資料方式,不需要配置path節點...
iOS訊息機制基於廣播模型
ios訊息機制基於廣播模型 訊息中心 nsnotificationcenter 是基於程序的單件例項 訊息佇列 nsnotificationqueue 是基於執行緒的,每個執行緒都有乙個預設的訊息佇列,這個佇列相關聯於訊息中心,每個訊息中心或執行緒可以關聯於多個佇列。訊息中心是採用同步方式 訊息佇列...
delphi類訊息的處理機制
delphi 類訊息的處理機制 文章不涉及 windows 訊息迴圈和更複雜的技術,只從 delphi 類繼承及類自身的訊息處理分析 是自己的學習心得和體驗 1.搜尋類本身有沒有處理該訊息值的函式 如果有 則終止迴圈 迴圈次數 1 2.搜尋父類有沒有處理該訊息值的函式 如果有 則終止迴圈 迴圈次數 ...