前言:
log4cxx的配置檔案完全和log4j相同,但是比較别扭的地方就是log4j使用com.aa.bb這樣組織類,用在log4cxx中多少有點别扭(無論如何也不會有人在命名空間中嵌套那麼多)。
http://erera.net/blog/log4cxx.html日志操作利器log4cxx
今天看了一場今年的比賽,jaedong對陣stork,非常精彩。突然感覺星際裡的微操和大局觀就類同C和C++的開發,寫C代碼的時候就滿腦子的位元組、移位、共享記憶體、檔案描述符之類的,C++就考慮類、模闆、重載、IO流、标準庫了。這隻是個引子,在C開發一直用openlog(), syslog() 來記錄日志,雖然友善,但不夠強大。今天來看一下C++中的一些日志操作庫。
流行的一些C++日志庫有好些,比如 , , , 功能依次增強吧。
目前的狀況是,log4cplus已然停止開發許久;log4cpp去年突然有了更新,更新到1.0穩定版;log4cxx今年有了更新,現在屬于 apache的一個項目;boost log功能最強,而且文檔十分詳盡,不過不清楚為何當年申請進入boost庫被reject。前三個有着共同的字首log4,意思是它們都是從 apache優秀的日志操作庫port出來的。優秀的實作總是在多個語言和平台上都會被人借鑒。
文檔狀況是,除了boost log外文檔都很匮乏,主要參照内容就是生成的API文檔。
性能上,一些早期的資料表明log4cpp性能相當出衆,它也是較早移植log4j的C++庫,log4cxx是後來apache自己的一個移植,具體性能影響和你使用的配置有關系。log4cxx是個線程安全并且支援多種appender的日志庫。
其他細節,log4cpp提供了一個對比表。log4cxx
log4j日志系統由三大類組成,它們又各自派生出不同功能的子類:
Layout 用來控制輸出日志消息的顯示樣式
Appender 用來輸出日志到某些裝置上,比如檔案、syslog、socket等
Category 在log4cxx裡叫作 Logger,真正完成日志記錄功能按日期記錄日志
這裡給出一個最常用的例子,就是按日期生成日志,但是代碼異常簡單。#include #include #include #include #include #include #include #include #include #include #include #include using namespace log4cxx;
using namespace log4cxx::rolling;
using namespace log4cxx::xml;
using namespace log4cxx::filter;
using namespace log4cxx::helpers;
void dailyRolling() {
PropertyConfigurator::configure(File("/etc/log4cxx.properties")); // Configure file, log4j format
LoggerPtr logger(Logger::getLogger("org.apache.log4j.DailyRollingFileAppender")); // Appender name
LOG4CXX_DEBUG(logger, "Hello World!"); // Debug level
LOG4CXX_INFO(logger, "Log4cxx's birth."); // INFO level
} log4j配置
雖然C++代碼可以寫的很簡單,但是我們可以進行很複雜的配置,讓log4cxx靈活的記錄資訊,比如上邊指定了配置檔案/etc/log4cxx.properties,這是一個Java特性檔案:
Log4j配置由三個重要的元件構成:日志資訊的優先級,日志資訊的輸出目的地,日志資訊的輸出格式。逐一解釋下:日志資訊的優先級
Logger的文法:log4j.rootLogger = [ level ] , appenderName, appenderName, …
其中,level 是日志記錄的優先級,分為OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL或者自定義的級别。Log4j建議隻使用四個級别,優 先級從高到低分别是ERROR、WARN、INFO、DEBUG。通過在這裡定義的級别,可以控制到應用程式中相應級别的日志資訊的開關。比如這裡定義了 INFO級别,則應用程式中所有DEBUG級别的日志資訊将不被列印出來。 appenderName名字任意,用來标示日志資訊輸出到哪裡,可以同時指定多個。日志資訊的輸出目的地
Appender的文法:log4j.appender.appenderName = fully.qualified.name.of.appender.class
log4j.appender.appenderName.option1 = value1
…
log4j.appender.appenderName.option = valueN
其中,Log4j提供的appender有以下幾種:
org.apache.log4j.ConsoleAppender 控制台
org.apache.log4j.FileAppender 檔案
org.apache.log4j.DailyRollingFileAppender 每天産生一個日志檔案
org.apache.log4j.RollingFileAppender 檔案大小到達指定尺寸的時候産生一個新的檔案
org.apache.log4j.WriterAppender 将日志資訊以流格式發送到任意指定的地方日志資訊的輸出格式
Layout的文法:log4j.appender.appenderName.layout = fully.qualified.name.of.layout.class
log4j.appender.appenderName.layout.option1 = value1
…
log4j.appender.appenderName.layout.option = valueN
其中,Log4j提供的Layout有以下幾種:
org.apache.log4j.HTMLLayout 以HTML表格形式布局
org.apache.log4j.PatternLayout 可以靈活地指定布局模式
org.apache.log4j.SimpleLayout 包含日志資訊的級别和資訊字元串
org.apache.log4j.TTCCLayout 包含日志産生的時間、線程、類别等等資訊
Log4j采用類似C語言中的printf函數的列印格式格式化日志資訊,列印參數如下:
%m 輸出代碼中指定的消息
%p 輸出優先級,即DEBUG,INFO,WARN,ERROR,FATAL
%r 輸出自應用啟動到輸出該log資訊耗費的毫秒數
%c 輸出所屬的類目,通常就是所在類的全名
%t 輸出産生該日志事件的線程名
%n 輸出一個回車換行符,Windows平台為“\r\n”,Unix平台為“\n”
%d 輸出日志時間點的日期或時間,預設格式為ISO8601,也可以在其後指定格式,比如:%d{yyy MMM dd HH:mm:ss,SSS},輸出2008年11月14日 15:16:17,890
%l 輸出日志事件的發生位置,包括類目名、發生的線程,以及在代碼中的行數。