基於訊息機制的日誌類

2021-07-31 18:21:36 字數 2179 閱讀 9362

之前用的日誌記錄是阻塞式的,會影響主程式的執行。於是我決定自己擼乙個用訊息機制來記錄日誌的日誌類。

既然是要用訊息機制,肯定要有乙個訊息佇列,還要有乙個執行緒來不斷接收訊息,寫日誌。另外還需要使用單例類來管理日誌的記錄

首先來看主體**,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.搜尋父類有沒有處理該訊息值的函式 如果有 則終止迴圈 迴圈次數 ...