log4cpp用了多年了, 一直用得很得心應(yīng)手.
現(xiàn)在做網(wǎng)游服務(wù)器, 日志類換成了log4cxx.
log4xx會(huì)自動(dòng)加載工作目錄下的log4j.properties, 這一點(diǎn)比較好, 使用更方便了.
log4j.properties應(yīng)該與log4j的配置文件完全一樣吧? 通用性好.
其他方面兩個(gè)日志類差不多. log4cxx::Logger對(duì)應(yīng)log4cpp::Category.
Appender, Layout都是相同的概念.
自從log4cxx從0.9.7升到0.10, 據(jù)說(shuō)內(nèi)部架構(gòu)重大更改, 而且有apache的大名頂著, 好像支持者大增.
而log4cpp成熟較早, 一直以來(lái)沒(méi)什么更新, 日漸衰落.
有一點(diǎn)重大區(qū)別, log4cxx不支持如printf格式的變參數(shù)日志:
log4cpp::Category::getRoot().info("%s %d", "test", 3);
而log4cxx只能先格式化一個(gè)字符串后再記日志.
log4cxx::Logger::getRootLogger()->info("A string");
這樣log4cxx的性能會(huì)差很多. 當(dāng)日志等級(jí)不需要記日志時(shí), 就應(yīng)該不要格式化字符串.
log4cxx有一組宏, 可以先判斷日志等級(jí), 然后再輸出.
LOG4CXX_DEBUG(logger, message)
可以這樣調(diào)用:
LOG4CXX_DEBUG(logger, "test " << 3);
可能是出于安全的考慮, 故意禁止用戶使用格式化串. 因?yàn)楦袷交疅o(wú)法檢測(cè)類型.
我以前在使用log4cpp的時(shí)候, 總是要多次檢查格式化串參數(shù)是否匹配.
也碰到過(guò)因?yàn)槿罩緦?dǎo)致程序崩潰的例子.
因?yàn)橄窬?錯(cuò)誤類的日志幾乎是不太可能出現(xiàn)的.
測(cè)試時(shí), 可能無(wú)法覆蓋這類日志代碼.
而使用流就可以大膽放心.
但是有大半的使用情況下, 流方式輸出會(huì)顯得冗長(zhǎng), 格式控制也沒(méi)有printf簡(jiǎn)潔.
只有簡(jiǎn)單的輸出才會(huì)使用流.
幸好有boost::format. 它就是類型安全的printf. log4cxx配合boost::format真是絕配.
例如:
LOG4CXX_DEBUG(logger, format("%1% %2%") % "test" % 3)
想起了好用的MFC CString::Format()和Delphi的Format(),
boost::format雖然用'%'顯得怪怪的, 但絕對(duì)是更安全的格式化串.
(轉(zhuǎn)載請(qǐng)注明來(lái)源于金慶的專欄)
現(xiàn)在做網(wǎng)游服務(wù)器, 日志類換成了log4cxx.
log4xx會(huì)自動(dòng)加載工作目錄下的log4j.properties, 這一點(diǎn)比較好, 使用更方便了.
log4j.properties應(yīng)該與log4j的配置文件完全一樣吧? 通用性好.
其他方面兩個(gè)日志類差不多. log4cxx::Logger對(duì)應(yīng)log4cpp::Category.
Appender, Layout都是相同的概念.
自從log4cxx從0.9.7升到0.10, 據(jù)說(shuō)內(nèi)部架構(gòu)重大更改, 而且有apache的大名頂著, 好像支持者大增.
而log4cpp成熟較早, 一直以來(lái)沒(méi)什么更新, 日漸衰落.
有一點(diǎn)重大區(qū)別, log4cxx不支持如printf格式的變參數(shù)日志:
log4cpp::Category::getRoot().info("%s %d", "test", 3);
而log4cxx只能先格式化一個(gè)字符串后再記日志.
log4cxx::Logger::getRootLogger()->info("A string");
這樣log4cxx的性能會(huì)差很多. 當(dāng)日志等級(jí)不需要記日志時(shí), 就應(yīng)該不要格式化字符串.
log4cxx有一組宏, 可以先判斷日志等級(jí), 然后再輸出.
LOG4CXX_DEBUG(logger, message)
可以這樣調(diào)用:
LOG4CXX_DEBUG(logger, "test " << 3);
可能是出于安全的考慮, 故意禁止用戶使用格式化串. 因?yàn)楦袷交疅o(wú)法檢測(cè)類型.
我以前在使用log4cpp的時(shí)候, 總是要多次檢查格式化串參數(shù)是否匹配.
也碰到過(guò)因?yàn)槿罩緦?dǎo)致程序崩潰的例子.
因?yàn)橄窬?錯(cuò)誤類的日志幾乎是不太可能出現(xiàn)的.
測(cè)試時(shí), 可能無(wú)法覆蓋這類日志代碼.
而使用流就可以大膽放心.
但是有大半的使用情況下, 流方式輸出會(huì)顯得冗長(zhǎng), 格式控制也沒(méi)有printf簡(jiǎn)潔.
只有簡(jiǎn)單的輸出才會(huì)使用流.
幸好有boost::format. 它就是類型安全的printf. log4cxx配合boost::format真是絕配.
例如:
LOG4CXX_DEBUG(logger, format("%1% %2%") % "test" % 3)
想起了好用的MFC CString::Format()和Delphi的Format(),
boost::format雖然用'%'顯得怪怪的, 但絕對(duì)是更安全的格式化串.
(轉(zhuǎn)載請(qǐng)注明來(lái)源于金慶的專欄)