首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

通用高效日誌系統設計:多目標輸出、線程安全與靈活擴展

     編輯:關於VC++

系統架構總覽

本日誌系統採用「策略模式」分離「日誌邏輯」與「存儲後端」,核心類別僅七個,結構清晰:

  • 存儲介面:IStoreLog(抽象基類) → CFileLog(檔案)、CWinLog(GUI 視窗)
  • 日誌前端:CLog(核心)、CFuncLog(函數進出追蹤 RAII)
  • 同步輔助:CAutoCritic、CLogSimpleLock(臨界區封裝,命名空間 LOGGER)

核心介面:IStoreLog

class IStoreLog {
public:
    virtual ~IStoreLog() {}
    virtual int FlushData() = 0;                    // 強制刷新緩衝區
    virtual int WriteString(const std::string& msg) = 0; // 寫入字串
    virtual int SetBufferLimit(long size) = 0;      // 設定緩衝上限
};
  • 預設採用緩衝寫入,達限或呼叫 FlushData 才落盤,提升效能。
  • CFileLog 內部用 CreateFile 開啟檔案,支援跨進程同步;CWinLog 建立視窗顯示,非線程安全,多進程請用 CFileLog。

日誌前端:CLog

構造與配置

CLog* m_pLog = new CLog(
    new CFileLog("c:\\log.log"),  // IStoreLog 實例
    LOG_MAX_LEVEL,                // 日誌級別閾值
    true                          // 析構時自動刪除存儲物件
);
  • 級別範例:0=ERROR, 1=WARNING, 2=INFO, 3=DEBUG… 自定義可覆寫虛擬函式 LevelText。
  • SetLogTime(bool) 控制時間戳輸出;SetTimeFormat 自訂格式(預設 %02u:%02u:%02u ms:%03u)。
  • SetAutoFlush(true) 逐條落盤(調試期);false 批量寫入(生產環境高效能)。
  • 訊息格式模板可透過 SetMessageFormat 調整,預設支援 12 個佔位符。

三大記錄函式

函式用途備註
LogRawString原始字串,無格式效能最佳
LogString帶級別與格式支援 std::string / char*
LogFormatStringprintf 風格格式化內部封裝 vsnprintf

函數追蹤神器:CFuncLog

利用 RAII 自動記錄函數進入/離開,極簡用法:

CRepTestApp::CRepTestApp() {
    CFuncLog log(m_pLog, "CRepTestApp::CRepTestApp"); // 建構時記 "enter"
    // ... 函數本體 ...
} // 析構時自動記 "leave"

void Foo() {
    CFuncLog log(m_pLog, "Foo");
    int x = 100;
    log << x;  // 重載 << 記錄任意資料(原始格式)
    log.LogString("custom message"); // 格式化記錄
}

擴展存儲後端

繼承 IStoreLog 實作 WriteString/FlushData/SetBufferLimit 即可接入資料庫、Syslog、雲端 API 等任意目的地。

線程安全說明

  • CFileLog:檔案操作由 OS 同步,**多進程/多線程安全**。
  • CWinLog:GUI 視窗非線程安全,僅建議單線程 UI 使用。
  • 自定後端需自行處理同步,可參考 LOGGER::CAutoCritic 封裝 CRITICAL_SECTION。

快速整合步驟

  1. 專案加入 clog.h/cpp, cfunclog.h/cpp, cfilelog.h/cpp(或 cwinlog.h/cpp)。
  2. 全域或 CWinApp 派生類建構 CLog 實例(建議單例)。
  3. 需追蹤的函數開頭宣告 CFuncLog log(m_pLog, __FUNCTION__)。
  4. 關鍵路徑插入 log << var 或 log.LogString(...)。
  5. 程式結束前 delete m_pLog 觸發最終刷新。

總結

本系統以 IStoreLog 抽象存儲細節,CLog 提供豐富格式與級別控制,CFuncLog 實現零侵入式函數追蹤,配合 CFileLog 的跨進程安全特性,極適合從小型工具到大型服務的統一日誌基礎設施。源碼附帶完整 Demo,可直接納入專案二次開發。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved