Log4cpp學(xué)習(xí)記錄
1.
下載
http://log4cpp.sourceforge.net/
2.
編譯(這一步一開始搞了比較久,后來搜到如下的信息幫助解決了)
問題:由于log4cpp-0.3.5rc3僅提供了vc6的工程文件,因此,使用vs2005打開后,需要進(jìn)行轉(zhuǎn)換。但是轉(zhuǎn)換后,不能正確編譯,提示Custom Build Step時(shí)出現(xiàn)了錯(cuò)誤。
分 析:因?yàn)?span lang="EN-US">log4cpp在生成NTEventLogAppender.dll時(shí),需要連接NTEventLogCategories.mc文件。所以,項(xiàng) 目設(shè)置了自定義的生成步驟去生成NTEventLogAppender.dll。但從vc6的工程文件轉(zhuǎn)換時(shí),這些步驟卻沒有正確的轉(zhuǎn)換過來。從而出現(xiàn)上
述問題。
解決方法:重新填寫Custom Build Step項(xiàng)。
其中,CommandLine填寫以下內(nèi)容:
if not exist $(OutDir) md $(OutDir)
"mc.exe" -h $(OutDir) -r $(OutDir) $(ProjectDir)..\$(InputName).mc
"RC.exe" -r -fo $(OutDir)\$(InputName).res $(OutDir)\$(InputName).rc
"link.exe" /MACHINE:IX86 -dll -noentry
-out:$(OutDir)\NTEventLogAppender.dll $(OutDir)\$(InputName).res
適用范圍:log4cpp項(xiàng)目、log4cppDLL項(xiàng)目的Debug和Release配置。同時(shí),該方法適用于vs2003(vc7.1)。
問題:log4cppDLL項(xiàng)目編譯時(shí)會報(bào)8個(gè)連接錯(cuò)誤,提示符號std::_Tree找不到
解決方案:
將include\log4cpp\FactoryParams.hh文件中的
const_iterator find(const std::string& t) const;
修改為
const_iterator find(const std::string& t) const {
return storage_.find(t); }
后重新編譯
問題:log4cppDLL項(xiàng)目編譯時(shí)會報(bào)1個(gè)連接錯(cuò)誤,提示符號log4cpp::localtime找不到
解決方案:
將src\localtime.cpp文件添加到項(xiàng)目中重新編譯
3.
使用
http://www-128.ibm.com/developerworks/cn/linux/l-log4cpp/index.html
log4cpp應(yīng)用手冊
1 下載log4cpp并解壓。
2 打開\log4cpp-0.3.4b\msvc6\msvc6.dsw
編譯log4cpp工程Release版。
3 將編譯后的log4cpp.lib復(fù)制到VC的Lib目錄中。
4 將頭文件的目錄log4cpp-0.3.4b\include\log4cpp\
復(fù)制到VC的Include目錄.
(或者添加log4cpp-0.3.4b\include到VC的Include環(huán)境變量)
6 目標(biāo)工程包含庫
log4cpp.lib ws2_32.lib
(要選擇庫連接方式相同的庫)
5 包含頭文件
日志記錄
#include
<log4cpp/Category.hh>
日志配置讀取
#include
<log4cpp/PropertyConfigurator.hh>
NDC
#include
<log4cpp/NDC.hh>
9 日志代碼
每個(gè)類可以有自己的類別(log4cpp::Category),
可以在配置文件中添加該類別并設(shè)置日志級別。
所有的log4cpp::Category都使用同一個(gè)Appender
不同的Category配置為不同的日志級別,就可以控制日志輸出的范圍。
一般只使用四個(gè)記錄日志級:DEBUG,INFO,WARN,ERROR
如:
log4cpp::Category::getRoot().info("Now
run line %d", __LINE__);
或使用非根類別
log4cpp::Category::getInstance("MyCat").info("Now
run line %d", __LINE__);
使用流:
log4cpp::Category::getInstance("main_cat").infoStream()
<< "This will show up as "
<< 1 << " emergency message"
<< log4cpp::CategoryStream::ENDLINE;
具體的函數(shù)說明見api文檔.
7 讀取配置代碼
讀取log配置文件,應(yīng)在log4cpp靜態(tài)成員初始化之后。
如在CXXXApp::InitInstance()中
try
{
log4cpp::PropertyConfigurator::configure("log.ini");
}
catch (log4cpp::ConfigureFailure e)
{
log4cpp::Category::getRoot().warn(e.what());
}
8 配置文件
[log4cpp]
# Set root category priority to DEBUG and its only appender to A1.
# priority enum: "FATAL", "ALERT", "CRIT",
"ERROR", "WARN",
#
"NOTICE", "INFO", "DEBUG", "NOTSET",
"UNKNOWN"
rootCategory=DEBUG,A1
additivity.rootCategory=false
# define appender
appender.A1=RollingFileAppender
#appender.A1.threshold=NOTSET
appender.A1.fileName=XXXX.log
#appender.A1.maxFileSize=10485760
#appender.A1.maxBackupIndex=1
appender.A1.layout=PatternLayout
appender.A1.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S}](%p)%c %x: %m%n
appender.Info_Cons=ConsoleAppender
appender.Info_Cons.threshold=INFO
appender.Info_Cons.layout=PatternLayout
appender.Info_Cons.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S}](%p)%c %x:
%m%n
# category for sub1
category.sub1=DEBUG,A1,Info_Cons
additivity.sub1=false
category.sub2=INFO,A1
additivity.sub1=false
# other categories
[others]
djkf=dksajf
最基本的使用方法;
手動使用log4cpp的基本步驟如下:
- 實(shí)例化一個(gè)layout
對象;
- 初始化一個(gè)appender
對象;
- 把layout對象附著在appender對象上;
- 調(diào)用log4cpp::Category::getInstance("name").
實(shí)例化一個(gè)category對象;
- 把appender對象附到category上(根據(jù)additivity的值取代其他appender或者附加在其他appender后)。
- 設(shè)置category的優(yōu)先級;
// FileName: test_log4cpp1.cpp
// Test log4cpp by manual operation.
// Announce: use as your own risk.
// Compile : g++ -otest1 -llog4cpp test_log4cpp1.cpp
// Run : ./test1
// Tested : RedHat 7.2 log4cpp0.3.4b
// Author : liqun (liqun@nsfocus.com)
// Data : 2003-6-27
#include "log4cpp/Category.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/BasicLayout.hh"
int main(int argc, char* argv[])
{
// 1實(shí)例化一個(gè)layout 對象
log4cpp::Layout* layout =
new log4cpp::BasicLayout();
// 2. 初始化一個(gè)appender 對象
log4cpp::Appender* appender = new
log4cpp::FileAppender("FileAppender",
"./test_log4cpp1.log");
// 3. 把layout對象附著在appender對象上
appender->setLayout(layout);
// 4. 實(shí)例化一個(gè)category對象
log4cpp::Category& warn_log =
log4cpp::Category::getInstance("mywarn");
// 5. 設(shè)置additivity為false,替換已有的appender
warn_log.setAdditivity(false);
// 5. 把appender對象附到category上
warn_log.setAppender(appender);
// 6. 設(shè)置category的優(yōu)先級,低于此優(yōu)先級的日志不被記錄
warn_log.setPriority(log4cpp::Priority::WARN);
// 記錄一些日志
warn_log.info("Program info which cannot be wirten");
warn_log.debug("This debug message will fail to write");
warn_log.alert("Alert info");
// 其他記錄日志方式
warn_log.log(log4cpp::Priority::WARN, "This will be a logged warning");
log4cpp::Priority::PriorityLevel priority;
bool this_is_critical = true;
if(this_is_critical)
priority = log4cpp::Priority::CRIT;
else
priority = log4cpp::Priority::DEBUG;
warn_log.log(priority,"Importance depends on context");
warn_log.critStream() << "This will show up << as "
<< 1 << " critical message"
<< log4cpp::CategoryStream::ENDLINE;
// clean up and flush all appenders
log4cpp::Category::shutdown();
return 0;
}
從以上例子,并結(jié)合文檔,可以看出,實(shí)際上,其Log是log4cpp::Category::的一部分,而這些Category可以綁定不同的appender,以使得log輸出到不同的出口,如文件或終端或網(wǎng)絡(luò)等。實(shí)際記錄的時(shí)候是靠優(yōu)先級來實(shí)現(xiàn)的,即優(yōu)先級低于目前的log所設(shè)定的優(yōu)先級,則不需要記錄此信息,只有高于當(dāng)前優(yōu)先級的log信息才會被記錄。對于Category的層次,log4cpp::Category::getRoot()為最高層次,其它getInstance(“name”)得到的只有命名為”name”的Category,應(yīng)該是Root()的子層。
Log4cpp的優(yōu)勢
1,提供應(yīng)用程序運(yùn)行上下文,方便跟蹤調(diào)試.這對開發(fā)人員很有幫助,特別是調(diào)試的時(shí)候,這一點(diǎn)log均可實(shí)現(xiàn).
2,把記錄的日志輸送到多種方式上.包括命令行,控制臺(調(diào)試的時(shí)候馬上就能看到哪里有問題),文件(把完整的日志信息保存起來,以利于整個(gè)系統(tǒng)的維護(hù),統(tǒng)計(jì)),回卷文件、內(nèi)存等.這一點(diǎn)是有特色的地方,因?yàn)槠渲挥幸粋€(gè)輸出內(nèi)容,但可綁定到多個(gè)輸出源,比如,你可以用控制臺輸出看到即時(shí)結(jié)果的同時(shí),將輸出的內(nèi)容存到文件中。或者你為了在測試的時(shí)候盡量不影響性能,可以將日志輸出到內(nèi)存,待關(guān)閉程序的時(shí)候再將其寫回到硬盤。
3,可以動態(tài)控制日志記錄級別,在效率和功能中進(jìn)行調(diào)整.當(dāng)執(zhí)行等級小于設(shè)定等級時(shí)就不輸出.其設(shè)定了INFO,DEBUG,ALERT,EMERGE等不同的級別,當(dāng)當(dāng)前Log的級別低于設(shè)定的需記錄的級別時(shí),將忽略此信息,這個(gè)對記錄不同程度的信息詳細(xì)度有幫助,可以專注于特定的重要級別的錯(cuò)誤的調(diào)試。
中第三節(jié)
5,現(xiàn)在log4**系列已經(jīng)開始支持其他語言了.如Java(log4j),C++(log4cpp、log4cplus),C(log4c),python(log4p)等.好的東西容易被人借鑒和傳播.
Log4cpp有三個(gè)主要的組件:日志類別(Category)、輸出源( Appenders)和布局(Layouts)。這三種類型的組件一起工作使得開發(fā)員可以根據(jù)信息的類型和級別記錄它們,并且在運(yùn)行時(shí)控制這些信息的輸出格式和位置。