http://blog.csdn.net/eclipser1987/article/details/6904301
log4cplus是C++編寫的開源的日志系統(tǒng),功能非常全面,用到自己開發(fā)的工程中會(huì)比較專業(yè)的,:),本文介紹了log4cplus基本概念,以及如何安裝,配置。
### 簡(jiǎn)介 ###
log4cplus是C++編寫的開源的日志系統(tǒng),前身是java編寫的log4j系統(tǒng).受Apache Software License保護(hù)。作者是Tad E. Smith。log4cplus具有線程安全、靈活、以及多粒度控制的特點(diǎn),通過將信息劃分優(yōu)先級(jí)使其可以面向程序調(diào)試、運(yùn)行、測(cè)試、和維護(hù)等全生命周期; 你可以選擇將信息輸出到屏幕、文件、NT event log、甚至是遠(yuǎn)程服務(wù)器;通過指定策略對(duì)日志進(jìn)行定期備份等等。
### 下載 ###
最新的log4cplus可以從以下網(wǎng)址下載 http://log4cplus.sourceforge.net本文使用的版本為:1.0.4
2. windows下的配置
將"log4cplus_dll class"工程或"log4cplus_static class"工程的dsp 文件插入到你的工程中,或者直接把兩個(gè)工程編譯生成的庫以及頭文件所在目錄放到你的工程的搜索路徑中,如果你使用靜態(tài)庫,請(qǐng)?jiān)谀愕墓こ讨?project/setting/C++"的preprocessor definitions中加入LOG4CPLUS_STATIC。
進(jìn)入log4cplus-1.0.4\log4cplus-1.0.4\msvc8目錄,雙擊log4cplus.sln使用Microsoft Visual Studio 2010打開文件。

編譯生成新的動(dòng)態(tài)庫或者靜態(tài)庫:

拷貝log4cplusSD.lib(靜態(tài)庫)以及 log4cplusD.lib + log4cplusD.dll (動(dòng)態(tài)庫)
注意:使用靜態(tài)鏈接,只需要log4cplusSD.lib即可,而使用動(dòng)態(tài)鏈接,則需要log4cplusD.lib + log4cplusD.dll 2個(gè)文件。
3。具體配置
首先,將log4cplus 頭文件,拷貝到Microsoft Visual Studio 2010安裝目下的include下,如:

將,log4cplusSD.lib以及l(fā)og4cplusD.lib 拷貝到Microsoft Visual Studio 2010安裝目下的lib下,如:

將log4cplusD.dll拷貝到Microsoft Visual Studio 2010安裝目下的bin下,如:

4。在環(huán)境配置完成后,我們可以對(duì)具體的項(xiàng)目環(huán)境進(jìn)行配置。
我們創(chuàng)建一個(gè)控制臺(tái)項(xiàng)目,并進(jìn)行如下配置:
1。采用靜態(tài)鏈接庫:
右鍵項(xiàng)目->屬性->

加入log4cplusSD.lib

注意:才用靜態(tài)鏈接庫,可以刪除bin目錄下的log4cplusD.dll 以及l(fā)ib目錄下的log4cplusD.lib 2個(gè)文件。
2。采用動(dòng)態(tài)鏈接庫:
右鍵項(xiàng)目->屬性->

注意:才用動(dòng)態(tài)鏈接庫,需要bin目錄下的log4cplusD.dll 以及l(fā)ib目錄下的log4cplusD.lib 2個(gè)文件。可以刪除lib目錄下的log4cplusSD.lib 文件
5.編寫簡(jiǎn)單程序并測(cè)試
#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官方源碼采用的“多字節(jié)字符集”,如果你項(xiàng)目采用“使用 Unicode 字符集”則可以將log4cplus字符集修改后重新生成對(duì)應(yīng)的庫文件!
以下為常用的封裝好的測(cè)試實(shí)例:
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 格式化前綴,默認(rèn)%d [%l] %-5p : %m %n
* @param bebug 是否打印bebug信息,默認(rèn)true
* @param lv 設(shè)置日記級(jí)別
* @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);


/**//**
* 關(guān)閉日志系統(tǒng)
*/
void ShutdownLogger(void);

#endif /* VLOG_H */

VLog.cpp

/**//************************************************************************/

/**//* 使用規(guī)則: */

/**//* 需要log4cplus動(dòng)態(tài)/靜態(tài)鏈接庫及頭文件 */

/**//* log4cplus.lib + log4cplus.dll 為動(dòng)態(tài)鏈接庫。log4cplusS.lib為靜態(tài)鏈接庫 */

/**//************************************************************************/
#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) :開放所有l(wèi)og信息輸出
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) :關(guān)閉所有l(wèi)og信息輸出

*/
{
// 0.日志系統(tǒng)配置:設(shè)置顯示debug信息
LogLog::getLogLog()->setInternalDebugging(bebug);


// 創(chuàng)建屏幕輸出Appender,不采用stderror流,不采用立刻寫入模式
SharedAppenderPtr pappender1(new RollingFileAppender(logfile, 1024 * 1024 * 200, 50, false));
// 生成的日志文件名稱,文件最大值(最小1 * 200 M),擴(kuò)展50文件個(gè)數(shù),不采用立刻寫入模式

// 2.實(shí)例化一個(gè)layout對(duì)象
// 2.1創(chuàng)建layout布局格式
std::auto_ptr<Layout> playout1(new PatternLayout(format));

// 3.將layout對(duì)象綁定(attach)到appender對(duì)象
// pappender.setLayout(std::auto_ptr<Layout> layout);
pappender1->setLayout(playout1);

// 4.Logger :記錄器,保存并跟蹤對(duì)象日志信息變更的實(shí)體,當(dāng)你需要對(duì)一個(gè)對(duì)象進(jìn)行記錄時(shí),就需要生成一個(gè)logger。
Logger rootLogger = Logger::getRoot();

// 5.將appender對(duì)象綁定(attach)到logger對(duì)象,如省略此步驟,標(biāo)準(zhǔn)輸出(屏幕)appender對(duì)象會(huì)綁定到logger
rootLogger.addAppender(pappender1);


if (console)
{
// 1.Appenders :掛接器,與布局器緊密配合,將特定格式的消息輸出到所掛接的設(shè)備終端 (如屏幕,文件等等)。
SharedAppenderPtr pappender2(new ConsoleAppender(false, false));
std::auto_ptr<Layout> playout2(new PatternLayout(format));
pappender2->setLayout(playout2);
rootLogger.addAppender(pappender2);
}

// 6.設(shè)置logger的優(yōu)先級(jí),如省略此步驟,各種有限級(jí)的消息都將被記錄
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> // 日志對(duì)象:測(cè)試一
log4cplus::Logger test1 = GetSubLogger(L"test1");
// 日志對(duì)象:測(cè)試一 第一次測(cè)試
log4cplus::Logger test1_01 = GetSubLogger(L"test1.01");</p><p> // 類型日志記錄
LOG4CPLUS_DEBUG(test1_01, "you can log like this :" << "hello " << 100 << '!');</p><p> // 關(guān)閉日志
ShutdownLogger();
}
