一.各種布局器
log4cplus通過布局器(Layouts)來控制輸出的格式,log4cplus提供了三種類型的Layouts分別是:
SimpleLayout、PatternLayout、和TTCCLayout。
二.SimpleLayout
是一種簡單格式的布局器,在輸出的原始信息之前加上LogLevel和一個"-"。
比如以下代碼片段:
// step 1: Instantiate an appender object
SharedObjectPtr _append (new ConsoleAppender());
_append->setName("append for test");
//step 2: Instantiate a layout object
std::auto_ptr _layout(new log4cplus::SimpleLayout());
//step 3: Attach the layout object to the appender
_append->setLayout( _layout );

//step 4: Instantiate a logger object
Logger _logger = Logger::getInstance("test");

//step 5: Attach the appender object to the logger
_logger.addAppender(_append);

//log activity
LOG4CPLUS_DEBUG(_logger, "This is the simple formatted log message
")



將打印結(jié)果:DEBUG - This is the simple formatted log message
三. PatternLayout
是一種有詞法分析功能的模式布局器,一提起模式就會想起正則表達式,
這里的模式和正則表達式類似,但是遠(yuǎn)比后者簡單,能夠?qū)︻A(yù)定義的標(biāo)識符
(稱為conversion specifiers)進行解析,轉(zhuǎn)換成特定格式輸出。以下代碼
片段演示了如何使用PatternLayout:

//step 1: Instantiate an appender object
SharedObjectPtr _append (new ConsoleAppender());
_append->setName("append for test");

//step 2: Instantiate a layout object
std::string pattern = "%d{%m/%d/%y %H:%M:%S} - %m [%l]%n";
std::auto_ptr _layout(new PatternLayout(pattern));

//step 3: Attach the layout object to the appender
_append->setLayout( _layout );

//step 4: Instantiate a logger object
Logger _logger = Logger::getInstance("test_logger.subtest");

//step 5: Attach the appender object to the logger
_logger.addAppender(_append);

//log activity
LOG4CPLUS_DEBUG(_logger, "teststr")

輸出結(jié)果:10/16/04 18:51:25 - teststr [main.cpp:51]
可以看出通過填寫特定格式的模式字符串"pattern",原始信息被包含到一堆有格式的信息當(dāng)中了,
這就使得用戶可以根據(jù)自身需要來定制顯示內(nèi)容。"pattern"可以包含普通字符串和預(yù)定義的標(biāo)識符,
其中:(
1)普通字符串,能夠被直接顯示的信息。
2)預(yù)定義標(biāo)識符,通過"%"與一個或多個字符共同構(gòu)成預(yù)定義的標(biāo)識符,能夠產(chǎn)生出特定格式信息。
關(guān)于預(yù)定義標(biāo)識符,log4cplus文檔中提供了詳細(xì)的格式說明,我每種都試了一下,以上述代碼為例,
根據(jù)不同的pattern,各種消息格式使用情況列舉如下:
(1)"%%",轉(zhuǎn)義為%, 即,std::string pattern = "%%" 時輸出: "%"
(2)"%c",輸出logger名稱,比如std::string pattern ="%c" 時輸出: "test_logger.subtest"
也可以控制logger名稱的顯示層次,比如"%c{1}"時輸出"test_logger",其中數(shù)字表示層次。
(3)"%D",顯示本地時間,當(dāng)std::string pattern ="%D" 時輸出:"2004-10-16 18:55:45",%d顯示標(biāo)準(zhǔn)時間,
所以當(dāng)std::string pattern ="%d" 時輸出 "2004-10-16 10:55:45" (因為我們是東8區(qū),差8個小時啊)。
可以通過%d{...}定義更詳細(xì)的顯示格式,比如%d{%H:%M:%s}表示要顯示小時:分鐘:秒。大括號中可顯示的
預(yù)定義標(biāo)識符如下:%a -- 表示禮拜幾,英文縮寫形式,比如"Fri"%A -- 表示禮拜幾,比如"Friday"%b -- 表示幾月份,
英文縮寫形式,
比如"Oct"%B -- 表示幾月份,"October"%c -- 標(biāo)準(zhǔn)的日期+時間格式,
如 "Sat Oct 16 18:56:19 2004"%d -- 表示今天是這個月的幾號(1-31)"16"%H -- 表示當(dāng)前時刻是幾時(0-23),
如 "18"%I -- 表示當(dāng)前時刻是幾時(1-12),如 "6"%j -- 表示今天是哪一天(1-366),
如 "290"%m -- 表示本月是哪一月(1-12),
如 "10"%M -- 表示當(dāng)前時刻是哪一分鐘(0-59),
如 "59"%p -- 表示現(xiàn)在是上午還是下午, AM or PM%q -- 表示當(dāng)前時刻中毫秒部分(0-999),
如 "237"%Q -- 表示當(dāng)前時刻中帶小數(shù)的毫秒部分(0-999.999),
如 "430.732"%S -- 表示當(dāng)前時刻的多少秒(0-59),
如 "32"%U -- 表示本周是今年的第幾個禮拜,以周日為第一天開始計算(0-53),
如 "41"%w -- 表示禮拜幾,(0-6, 禮拜天為0),
如 "6"%W -- 表示本周是今年的第幾個禮拜,以周一為第一天開始計算(0-53),
如 "41"%x -- 標(biāo)準(zhǔn)的日期格式,如 "10/16/04"%X -- 標(biāo)準(zhǔn)的時間格式,
如 "19:02:34"%y -- 兩位數(shù)的年份(0-99),如 "04"%Y -- 四位數(shù)的年份,
如 "2004"%Z -- 時區(qū)名,比如 "GMT"
(4)"%F",輸出當(dāng)前記錄器所在的文件名稱,比如std::string pattern ="%F" 時輸出: "main.cpp"
(5)"%L",輸出當(dāng)前記錄器所在的文件行號,比如std::string pattern ="%L" 時輸出: "51"
(6)"%l",輸出當(dāng)前記錄器所在的文件名稱和行號,比如std::string pattern ="%L" 時輸出: "main.cpp:51"
(7)"%m",輸出原始信息,比如std::string pattern ="%m" 時輸出: "teststr",即上述代碼中 LOG4CPLUS_DEBUG的第二個參數(shù),
這種實現(xiàn)機制可以確保原始信息被嵌入到帶格式的信息中。
(8)"%n",換行符,沒什么好解釋的
(9)"%p",輸出LogLevel,比如std::string pattern ="%p" 時輸出: "DEBUG"
(10)"%t",輸出記錄器所在的線程ID,比如std::string pattern ="%t" 時輸出: "1075298944"
(11)"%x",嵌套診斷上下文NDC (nested diagnostic context) 輸出,從堆棧中彈出上下文信息,NDC可以用對
不同源的log信息(同時地)交叉輸出進行區(qū)分,關(guān)于NDC方面的詳細(xì)介紹會在下文中提到。
(12)格式對齊,比如std::string pattern ="%-10m"時表示左對齊,寬度是10,此時會輸出"teststr ",當(dāng)
然其它的控制字符也可以相同的方式來使用,比如"%-12d","%-5p"等等(剛接觸log4cplus文檔時還以為
"%-5p"整個字符串代表LogLevel呢,呵呵)。
四. TTCCLayout
是在PatternLayout基礎(chǔ)上發(fā)展的一種缺省的帶格式輸出的布局器, 其格式由時間,線程ID,Logger和NDC 組成
。提供給那些想顯示典型的信息(一般情況下夠用了)又懶得配置pattern的同志們。
TTCCLayout在構(gòu)造時有機會選擇顯示本地時間或GMT時間,缺省是按照本地時間顯示:
TTCCLayout::TTCCLayout(bool use_gmtime = false)
以下代碼片段演示了如何使用TTCCLayout:

// step 1: Instantiate an appender object
SharedObjectPtr _append (new ConsoleAppender());
_append->setName("append for test");
//step 2: Instantiate a layout object
std::auto_ptr _layout(new TTCCLayout());
//step 3: Attach the layout object to the appender
_append->setLayout( _layout );
//step 4: Instantiate a logger object
Logger _logger = Logger::getInstance("test_logger");
//step 5: Attach the appender object to the logger
_logger.addAppender(_append);
//log activity
LOG4CPLUS_DEBUG(_logger, "teststr")
輸出結(jié)果:10-16-04 19:08:27,501 [1075298944] DEBUG test_logger <> - teststr
當(dāng)構(gòu)造TTCCLayout對象時選擇GMT時間格式時:
//step 2: Instantiate a layout object
std::auto_ptr _layout(new TTCCLayout(true));
輸出結(jié)果:10-16-04 11:12:47,678 [1075298944] DEBUG test_logger <> - teststr
*/
log4cplus通過布局器(Layouts)來控制輸出的格式,log4cplus提供了三種類型的Layouts分別是:
SimpleLayout、PatternLayout、和TTCCLayout。
二.SimpleLayout
是一種簡單格式的布局器,在輸出的原始信息之前加上LogLevel和一個"-"。
比如以下代碼片段:


























三. PatternLayout
是一種有詞法分析功能的模式布局器,一提起模式就會想起正則表達式,
這里的模式和正則表達式類似,但是遠(yuǎn)比后者簡單,能夠?qū)︻A(yù)定義的標(biāo)識符
(稱為conversion specifiers)進行解析,轉(zhuǎn)換成特定格式輸出。以下代碼
片段演示了如何使用PatternLayout:


























這就使得用戶可以根據(jù)自身需要來定制顯示內(nèi)容。"pattern"可以包含普通字符串和預(yù)定義的標(biāo)識符,
其中:(
1)普通字符串,能夠被直接顯示的信息。
2)預(yù)定義標(biāo)識符,通過"%"與一個或多個字符共同構(gòu)成預(yù)定義的標(biāo)識符,能夠產(chǎn)生出特定格式信息。
關(guān)于預(yù)定義標(biāo)識符,log4cplus文檔中提供了詳細(xì)的格式說明,我每種都試了一下,以上述代碼為例,
根據(jù)不同的pattern,各種消息格式使用情況列舉如下:
(1)"%%",轉(zhuǎn)義為%, 即,std::string pattern = "%%" 時輸出: "%"
(2)"%c",輸出logger名稱,比如std::string pattern ="%c" 時輸出: "test_logger.subtest"
也可以控制logger名稱的顯示層次,比如"%c{1}"時輸出"test_logger",其中數(shù)字表示層次。
(3)"%D",顯示本地時間,當(dāng)std::string pattern ="%D" 時輸出:"2004-10-16 18:55:45",%d顯示標(biāo)準(zhǔn)時間,
所以當(dāng)std::string pattern ="%d" 時輸出 "2004-10-16 10:55:45" (因為我們是東8區(qū),差8個小時啊)。
可以通過%d{...}定義更詳細(xì)的顯示格式,比如%d{%H:%M:%s}表示要顯示小時:分鐘:秒。大括號中可顯示的
預(yù)定義標(biāo)識符如下:%a -- 表示禮拜幾,英文縮寫形式,比如"Fri"%A -- 表示禮拜幾,比如"Friday"%b -- 表示幾月份,
英文縮寫形式,
比如"Oct"%B -- 表示幾月份,"October"%c -- 標(biāo)準(zhǔn)的日期+時間格式,
如 "Sat Oct 16 18:56:19 2004"%d -- 表示今天是這個月的幾號(1-31)"16"%H -- 表示當(dāng)前時刻是幾時(0-23),
如 "18"%I -- 表示當(dāng)前時刻是幾時(1-12),如 "6"%j -- 表示今天是哪一天(1-366),
如 "290"%m -- 表示本月是哪一月(1-12),
如 "10"%M -- 表示當(dāng)前時刻是哪一分鐘(0-59),
如 "59"%p -- 表示現(xiàn)在是上午還是下午, AM or PM%q -- 表示當(dāng)前時刻中毫秒部分(0-999),
如 "237"%Q -- 表示當(dāng)前時刻中帶小數(shù)的毫秒部分(0-999.999),
如 "430.732"%S -- 表示當(dāng)前時刻的多少秒(0-59),
如 "32"%U -- 表示本周是今年的第幾個禮拜,以周日為第一天開始計算(0-53),
如 "41"%w -- 表示禮拜幾,(0-6, 禮拜天為0),
如 "6"%W -- 表示本周是今年的第幾個禮拜,以周一為第一天開始計算(0-53),
如 "41"%x -- 標(biāo)準(zhǔn)的日期格式,如 "10/16/04"%X -- 標(biāo)準(zhǔn)的時間格式,
如 "19:02:34"%y -- 兩位數(shù)的年份(0-99),如 "04"%Y -- 四位數(shù)的年份,
如 "2004"%Z -- 時區(qū)名,比如 "GMT"
(4)"%F",輸出當(dāng)前記錄器所在的文件名稱,比如std::string pattern ="%F" 時輸出: "main.cpp"
(5)"%L",輸出當(dāng)前記錄器所在的文件行號,比如std::string pattern ="%L" 時輸出: "51"
(6)"%l",輸出當(dāng)前記錄器所在的文件名稱和行號,比如std::string pattern ="%L" 時輸出: "main.cpp:51"
(7)"%m",輸出原始信息,比如std::string pattern ="%m" 時輸出: "teststr",即上述代碼中 LOG4CPLUS_DEBUG的第二個參數(shù),
這種實現(xiàn)機制可以確保原始信息被嵌入到帶格式的信息中。
(8)"%n",換行符,沒什么好解釋的
(9)"%p",輸出LogLevel,比如std::string pattern ="%p" 時輸出: "DEBUG"
(10)"%t",輸出記錄器所在的線程ID,比如std::string pattern ="%t" 時輸出: "1075298944"
(11)"%x",嵌套診斷上下文NDC (nested diagnostic context) 輸出,從堆棧中彈出上下文信息,NDC可以用對
不同源的log信息(同時地)交叉輸出進行區(qū)分,關(guān)于NDC方面的詳細(xì)介紹會在下文中提到。
(12)格式對齊,比如std::string pattern ="%-10m"時表示左對齊,寬度是10,此時會輸出"teststr ",當(dāng)
然其它的控制字符也可以相同的方式來使用,比如"%-12d","%-5p"等等(剛接觸log4cplus文檔時還以為
"%-5p"整個字符串代表LogLevel呢,呵呵)。
四. TTCCLayout
是在PatternLayout基礎(chǔ)上發(fā)展的一種缺省的帶格式輸出的布局器, 其格式由時間,線程ID,Logger和NDC 組成
。提供給那些想顯示典型的信息(一般情況下夠用了)又懶得配置pattern的同志們。
TTCCLayout在構(gòu)造時有機會選擇顯示本地時間或GMT時間,缺省是按照本地時間顯示:
TTCCLayout::TTCCLayout(bool use_gmtime = false)
以下代碼片段演示了如何使用TTCCLayout:




































