log4cplus是C++編寫的開源的日誌系統,功能非常全面,用到自己開發的工程中會比較專業的,:),本文介紹了log4cplus基本概念,以及如何安裝,配置。
### 簡介 ###
log4cplus是C++編寫的開源的日誌系統,前身是java編寫的log4j系統.受Apache Software License保護。作者是Tad E. Smith。log4cplus具有安全執行緒、靈活、以及多粒度控制的特點,通過將資訊劃分優先順序使其可以面向程式調試、運行、測試、和維護等全生命週期; 你可以選擇將資訊輸出到螢幕、檔案、NT event log、甚至是遠程伺服器;通過指定策略對日誌進行定期備份等等。
### 下載 ###
最新的log4cplus可以從以下網址下載 http://log4cplus.sourceforge.net本文使用的版本為:1.0.4
2. windows下的配置
將"log4cplus_dll class"工程或"log4cplus_static class"工程的dsp 檔案插入到你的工程中,或者直接把兩個工程編譯產生的庫以及標頭檔所在目錄放到你的工程的搜尋路徑中,如果你使用靜態庫,請在你的工程中"project/setting/C++"的preprocessor definitions中加入LOG4CPLUS_STATIC。
進入log4cplus-1.0.4\log4cplus-1.0.4\msvc8目錄,雙擊log4cplus.sln使用Microsoft Visual Studio 2010開啟檔案。
編譯產生新的動態庫或者靜態庫:
拷貝log4cplusSD.lib(靜態庫)以及 log4cplusD.lib + log4cplusD.dll (動態庫)
注意:使用靜態連結,只需要log4cplusSD.lib即可,而使用動態連結,則需要log4cplusD.lib + log4cplusD.dll 2個檔案。
3。具體配置
首先,將log4cplus 標頭檔,拷貝到Microsoft Visual Studio 2010安裝目下的include下,如:
將,log4cplusSD.lib以及log4cplusD.lib 拷貝到Microsoft Visual Studio 2010安裝目下的lib下,如:
將log4cplusD.dll拷貝到Microsoft Visual Studio 2010安裝目下的bin下,如:
4。在環境配置完成後,我們可以對具體的項目環境進行配置。
我們建立一個控制台項目,並進行如下配置:
1。採用靜態連結庫:
右鍵項目->屬性->
加入log4cplusSD.lib
注意:才用靜態連結庫,可以刪除bin目錄下的log4cplusD.dll 以及lib目錄下的log4cplusD.lib 2個檔案。
2。採用動態連結程式庫:
右鍵項目->屬性->
注意:才用動態連結程式庫,需要bin目錄下的log4cplusD.dll 以及lib目錄下的log4cplusD.lib 2個檔案。可以刪除lib目錄下的log4cplusSD.lib 檔案
5.編寫簡單程式並測試
#include "stdafx.h" #include <log4cplus/logger.h> #include <log4cplus/configurator.h> #include <iomanip> using namespace log4cplus; int _tmain(int argc, _TCHAR* argv[]) { BasicConfigurator config; config.configure(); Logger logger = Logger::getInstance("main"); LOG4CPLUS_WARN(logger, "Hello, World!"); getchar(); return 0; }
注意:
log4cplus官方源碼採用的“多位元組字元集”,如果你項目採用“使用 Unicode 字元集”則可以將log4cplus字元集修改後重建對應的庫檔案。
以下為常用的封裝好的測試執行個體:
VLog.h
#pragma once #ifndef VLOG_H #define VLOG_H #include <log4cplus/logger.h> #include <log4cplus/layout.h> #include <log4cplus/loglevel.h> #include <log4cplus/fileappender.h> #include <log4cplus/consoleappender.h> #include <log4cplus/helpers/loglog.h> using namespace log4cplus; using namespace helpers; /** * 使用log4cplus * @param logfile 記錄的檔案路徑,如“main.log” * @param format 格式化首碼,預設%d [%l] %-5p : %m %n * @param bebug 是否列印bebug資訊,預設true * @param lv 設定日記層級 * @return */ void InitLog4cplus( const wchar_t* logfile, const bool console = true, const bool bebug = true, LogLevel lv = DEBUG_LOG_LEVEL, const wchar_t* format = L"%d : %m%n" /*%d %-5p [%c < %l] : %m %n*/ ); /** * 獲得根日誌 * @return */ Logger GetRootLogger(void); /** * 獲得子日誌 * @param child 子日誌名,如,sub;sub.sub1 * @return */ Logger GetSubLogger(const wchar_t* sub); /** * 關閉日誌系統 */ void ShutdownLogger(void); #endif /* VLOG_H */
VLog.cpp
/************************************************************************/ /* 使用規則: */ /* 需要log4cplus動態/靜態連結庫及標頭檔 */ /* log4cplus.lib + log4cplus.dll 為動態連結程式庫。log4cplusS.lib為靜態連結庫 */ /************************************************************************/ #include "VLog.h" void InitLog4cplus(const wchar_t* logfile, const bool console, const bool bebug, LogLevel lv, const wchar_t* format) /* NOT_SET_LOG_LEVEL ( -1) :接受預設的LogLevel,如果有父logger則繼承它的 LogLevelALL_LOG_LEVEL ( 0) :開放所有log資訊輸出 TRACE_LOG_LEVEL ( 0) :開放trace資訊輸出(即ALL_LOG_LEVEL) DEBUG_LOG_LEVEL (10000) :開放debug資訊輸出 INFO_LOG_LEVEL (20000) :開放info資訊輸出 WARN_LOG_LEVEL (30000) :開放warning資訊輸出 ERROR_LOG_LEVEL (40000) :開放error資訊輸出 FATAL_LOG_LEVEL (50000) :開放fatal資訊輸出 OFF_LOG_LEVEL (60000) :關閉所有log資訊輸出 */ { // 0.日誌系統配置:設定顯示debug資訊 LogLog::getLogLog()->setInternalDebugging(bebug); // 建立螢幕輸出Appender,不採用stderror流,不採用立刻寫入模式 SharedAppenderPtr pappender1(new RollingFileAppender(logfile, 1024 * 1024 * 200, 50, false)); // 產生的記錄檔名稱,檔案最大值(最小1 * 200 M),擴充50檔案個數,不採用立刻寫入模式 // 2.執行個體化一個layout對象 // 2.1建立layout布局格式 std::auto_ptr<Layout> playout1(new PatternLayout(format)); // 3.將layout對象綁定(attach)到appender對象 // pappender.setLayout(std::auto_ptr<Layout> layout); pappender1->setLayout(playout1); // 4.Logger :記錄器,儲存並跟蹤對象日誌資訊變更的實體,當你需要對一個對象進行記錄時,就需要產生一個logger。 Logger rootLogger = Logger::getRoot(); // 5.將appender對象綁定(attach)到logger對象,如省略此步驟,標準輸出(螢幕)appender對象會綁定到logger rootLogger.addAppender(pappender1); if (console) { // 1.Appenders :掛接器,與布局器緊密配合,將特定格式的訊息輸出到所掛接的裝置終端 (如螢幕,檔案等等)。 SharedAppenderPtr pappender2(new ConsoleAppender(false, false)); std::auto_ptr<Layout> playout2(new PatternLayout(format)); pappender2->setLayout(playout2); rootLogger.addAppender(pappender2); } // 6.設定logger的優先順序,如省略此步驟,各種有限級的訊息都將被記錄 rootLogger.setLogLevel(lv); } Logger GetRootLogger(void) { return Logger::getRoot(); } Logger GetSubLogger(const wchar_t* sub) { return Logger::getInstance(sub); } void ShutdownLogger(void) { Logger::getRoot().shutdown(); }
Main.cpp
#include "VLog.h"
int _tmain(int argc, _TCHAR* argv[]) {
// 加入log4cplus // 初始化log4cplus InitLog4cplus(L"main.log");</p><p> // 日誌對象:測試一 log4cplus::Logger test1 = GetSubLogger(L"test1"); // 日誌對象:測試一 第一次測試 log4cplus::Logger test1_01 = GetSubLogger(L"test1.01");</p><p> // 類型日誌記錄 LOG4CPLUS_DEBUG(test1_01, "you can log like this :" << "hello " << 100 << '!');</p><p> // 關閉日誌 ShutdownLogger(); }