本日誌系統採用「策略模式」分離「日誌邏輯」與「存儲後端」,核心類別僅七個,結構清晰:
IStoreLog(抽象基類) → CFileLog(檔案)、CWinLog(GUI 視窗)CLog(核心)、CFuncLog(函數進出追蹤 RAII)CAutoCritic、CLogSimpleLock(臨界區封裝,命名空間 LOGGER)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* m_pLog = new CLog(
new CFileLog("c:\\log.log"), // IStoreLog 實例
LOG_MAX_LEVEL, // 日誌級別閾值
true // 析構時自動刪除存儲物件
);
LevelText。SetLogTime(bool) 控制時間戳輸出;SetTimeFormat 自訂格式(預設 %02u:%02u:%02u ms:%03u)。SetAutoFlush(true) 逐條落盤(調試期);false 批量寫入(生產環境高效能)。SetMessageFormat 調整,預設支援 12 個佔位符。| 函式 | 用途 | 備註 |
|---|---|---|
LogRawString | 原始字串,無格式 | 效能最佳 |
LogString | 帶級別與格式 | 支援 std::string / char* |
LogFormatString | printf 風格格式化 | 內部封裝 vsnprintf |
利用 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。clog.h/cpp, cfunclog.h/cpp, cfilelog.h/cpp(或 cwinlog.h/cpp)。CWinApp 派生類建構 CLog 實例(建議單例)。CFuncLog log(m_pLog, __FUNCTION__)。log << var 或 log.LogString(...)。delete m_pLog 觸發最終刷新。本系統以 IStoreLog 抽象存儲細節,CLog 提供豐富格式與級別控制,CFuncLog 實現零侵入式函數追蹤,配合 CFileLog 的跨進程安全特性,極適合從小型工具到大型服務的統一日誌基礎設施。源碼附帶完整 Demo,可直接納入專案二次開發。