• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            牽著老婆滿街逛

            嚴(yán)以律己,寬以待人. 三思而后行.
            GMail/GTalk: yanglinbo#google.com;
            MSN/Email: tx7do#yahoo.com.cn;
            QQ: 3 0 3 3 9 6 9 2 0 .

            開源日志系統(tǒng)log4cplus(三)

            本文介紹了三種控制輸出格式的布局管理器的概念和使用情況,通過掌握這些知識(shí),可以更有效地控制log系統(tǒng)輸出盡可能貼近你需求的信息來。

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

            posted on 2006-08-26 04:49 楊粼波 閱讀(5081) 評(píng)論(1)  編輯 收藏 引用 所屬分類: Windows編程Linux編程

            評(píng)論

            # re: 開源日志系統(tǒng)log4cplus(三) 2013-11-21 18:02 wooduuuu

            多謝多謝,非常有用!  回復(fù)  更多評(píng)論   

            精品乱码久久久久久夜夜嗨| 久久久久精品国产亚洲AV无码| 国产精品99久久久久久人| 天天爽天天爽天天片a久久网| 国产成人无码精品久久久久免费 | 国产亚州精品女人久久久久久| 久久露脸国产精品| 中文字幕久久久久人妻| 精品无码久久久久久久久久| 99久久精品免费看国产一区二区三区 | 亚洲欧美一级久久精品| 久久婷婷五月综合97色一本一本 | 人妻精品久久久久中文字幕| 久久人人爽人人爽人人片AV不| 国产精品成人久久久久久久| 色妞色综合久久夜夜| 欧美一级久久久久久久大| 久久影院综合精品| 久久99热这里只有精品66| 国产精品欧美久久久久天天影视| 久久国产乱子伦免费精品| 99久久国产亚洲综合精品| 国产亚洲精久久久久久无码AV| 久久精品aⅴ无码中文字字幕不卡 久久精品aⅴ无码中文字字幕重口 | 综合久久精品色| 色综合久久久久| 国产精品对白刺激久久久| 久久精品国产男包| 漂亮人妻被中出中文字幕久久| 久久久国产精华液| 国产伊人久久| 国产精品成人久久久久久久| 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲高清不卡 国产成人精品久久亚洲 | 久久久久人妻一区二区三区 | 狠色狠色狠狠色综合久久| 久久丝袜精品中文字幕| 99久久精品无码一区二区毛片 | 伊人久久综合精品无码AV专区| 久久久久久毛片免费看| 久久国产一片免费观看| 国产精品欧美亚洲韩国日本久久|