VC-Logger 是一個簡單易用的 C++ 程序通用日志組件。設計時着重考慮三個方面:功能、可用性和性能。為了讓大家能更方便的學習 VC-Logger,特此精心制作了幾個測試用例:TestGUILogger(GUI 版本測試用例 / 靜態加載)、TestDynamicLogger(GUI 版本測試用例 / 動態加載)、TestConsoleLogger(Console 版本測試用例 / 靜態加載)。
(項目主頁:http://www.jessma.org,下載地址:http://www.oschina.net/p/vc-logger)
功能: 本日志組件的目的是滿足大多數應用程序記錄日志的需求 —— 把日志輸出到文件或發送到應用程序中,並不提供一些復雜但不常用的功能。本日志組件的功能包括:
- 把日志信息輸出到指定文件
- 每日生成一個日志文件
- 對於 GUI 程序,可以把日志信息發送到指定窗口
- 對於Console應用程序,可以把日志信息發往標准輸出 (std::cout)
- 支持 MBCS / UNICODE,Console / GUI 程序
- 支持動態加載和靜態加載日志組件 DLL
- 支持 DEBUG/TRACE/INFO/WARN/ERROR/FATAL 等多個日志級別
可用性: 本日志組件着重考慮了可用性,盡量讓使用者用起來覺得簡便、舒心:
- 簡單純凈:不依賴任何程序庫或框架
- 使用接口簡單,不需復雜的配置或設置工作
- 提供 CStaticLogger 和 CDynamicLogger 包裝類用於靜態或動態加載以及操作日志組件,用戶無 需關注加載細節
- 程序如果要記錄多個日志文件只需為每個日志文件創建相應的 CStaticLogger 或 CDynamicLogger 對象
- 只需調用 Log()/Debug()/Trace()/Info()/Warn()/Error()/Fatal() 等方法記錄日志
- 日志記錄方法支持可變參數
- 日志輸出格式:<時間> <線程ID> <日志級別> <日志內容>
性能: 性能是組件是否值得使用的硬指標,本組件從設計到編碼的過程都盡量考慮到性能優化:
- 支持多線程同時發送寫日志請求
- 使用單獨線程在后台寫日志,不影響工作線程的正常執行
- 采用批處理方式批量記錄日志
*** 使用方法 ***
方法一:(靜態加載 Logger DLL)
--------------------------------------------------------------------------------------
- 應用程序包含 StaticLogger.h 頭文件
- 創建 CStaticLogger 對象(通常為全局對象)
- 調用 CStaticLogger->Init(...) 初始化日志組件
- 使用 CStaticLogger->Log()/Debug()/Trace()/Info()/Warn()/Error()/Fatal() 等方法寫日志
- 調用 CStaticLogger->UnInit(...) 清理日志組件(CStaticLogger 對象析構時也會自動清理日志組件)
方法二:(動態加載 Logger DLL)
--------------------------------------------------------------------------------------
- 應用程序包含 DynamicLogger.h 頭文件
- 創建 CDynamicLogger 對象(通常為全局對象)
- 調用 CDynamicLogger->Init(...) 初始化日志組件
- 使用 CDynamicLogger->Log()/Debug()/Trace()/Info()/Warn()/Error()/Fatal() 等方法寫日志
- 調用 CDynamicLogger->UnInit(...) 清理日志組件(CDynamicLogger 對象析構時也會自動清理日志組件)
方法三:(直接用導出函數加載 Logger DLL)
--------------------------------------------------------------------------------------
- 應用程序包含 Logger.h 頭文件
- 手工調用 ILoger_Create() 和 ILoger_Create() 導出函數創建和銷毀 ILogger 對象
(注:如果是動態加載,需手工調用 ::LoadLibrary()/::FreeLibrary() 系列 API 函數加載和卸載 Logger DLL)
[
***** 對於希望通過窗口接收日志信息的 GUI 程序 *****
A. 日志組件初始化成功后調用 SetGUIWindow(HWND) 設置收日志的窗口
B. 窗口須響應處理 LOG_MESSAGE 消息
C. 處理完 LOG_MESSAGE 消息后,調用 ILogger::FreeLogMsg() 銷毀接收到的 TLogMsg
]
Environment:
- Windows 2000 or later (_WIN32_WINNT >= 0x0500)
- VC++ 2010 or later
Release:
- Logger_C.dll - Console/MBCS/Release
- Logger_CD.dll - Console/MBCS/Debug
- Logger_CU.dll - Console/Unicode/Release
- Logger_CUD.dll - Console/Unicode/Debug
- Logger.dll - GUI/MBCS/Release
- Logger_D.dll - GUI/MBCS/Debug
- Logger_U.dll - GUI/Unicode/Release
- Logger_UD.dll - GUI/Unicode/Debug
Examples:
- TestGUILogger - GUI 版測試程序 (靜態加載)
- TestDynamicLogger - GUI 版測試程序 (動態加載)
- TestConsoleLogger - Console 版測試程序 (靜態加載)
相關博文:《Windows C++ 應用程序通用日志組件(組件及測試程序下載)》
眾所周知,在調試、跟蹤和執行應用程序的過程中,程序的日志能為這些工作提供大量有價值的運行信息。因此,程序的日志對應用程序的運行、維護至關重要。
在如何記錄程序日志方面,通常有三種選擇:
1、采用Log4CXX等公共開源日志組件:這類日志組件的特點是跨平台且功能比較強大,例如可以把日志發往另一台服務器或記錄到數據庫中等;另外,可配置性較高,可以通過配置文件或程序代碼對日志進行很多個性化設置。但從另外一個角度看,由於這些優點往往也導致了在使用方面的缺點。首先,對於一般應用程序來說,它們並不需要太多的功能,通常只需要把日志記錄到文件或反饋到應用程序,功能太多反正讓用戶使用起來覺得繁瑣還得背負很多從來都用不到的代碼。其次,這類日志組件通常是跨平台的,並不只是針對 Windows 或 VC 的應用程序,因此使用起來總會覺得有點別扭,例如他們的字符都是用 char 類型的,對於一個 Unicode 程序來說每次寫日志都要做字符轉換是很不爽的事情,本座在多年前曾經使用過 Log4Cpp ,程序執行時總是報告日志組件有內存泄露,雖然有可能是誤報,但是使用起來總覺得很不舒服。
2、自己寫幾個簡單的類或函數記錄日志:這種方法的確很簡單,通常都不用一兩百行的代碼。但這種方法通常缺乏規范性和通用性,其他程序需要記錄類似的但有點差異的日志時,通常的作法是:Copy-Paste-Modify;另外,這類方法很可能也沒有考慮性能或並發方面的問題,通常是直接在工作線程中寫日志,對於那些性能要求較高的應用程序是絕對不允許的。
3、干脆不記錄任何日志:的確,現在很多程序由於各種原因並沒有記錄任何日志。但本座以為,如果一個程序是有用的,具備一定功能,並且需要連續運行較長一段時間,那么記錄日志是必須的;否則,得認真考慮該程序是否有存在的必要了。