• <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>

               C++ 技術中心

               :: 首頁 :: 聯系 ::  :: 管理
              160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

            公告

            鄭重聲明:本BLOG所發表的原創文章,作者保留一切權利。必須經過作者本人同意后方可轉載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評論

            評論排行榜

            一.簡介
                log4cplus是一個日志記錄的庫,目的很簡單,就是把合適的信息送到正確的位置上去。在服務器程序上使用非常方便。
                開發庫下載地址可以去baidu搜一下,是開源的哦!

            二.組成
              Log4cplus 由4部分組成:
             (1) Logger          日志模塊,程序中唯一一個必須得使用的模塊,解決了在哪里使用日志的問題
             (2) Appenders    接收日志的各個設備,如控制臺、文件、網絡等。解決了輸出到哪里去的問題
             (3)Layout           格式化輸出信息,解決了如何輸出的問題。
             (4)Filter              過濾器,解決哪些信息需要輸出的問題,比如DEBUG,WARR,INFO等的輸出控制.
              Log4cplus的主要部件關系圖如下:


            三.一些簡單示例
            (1) 各對象可以看下上圖理解一下,以下為 嚴格實現步驟1-6
            #include <log4cplus/logger.h>
            #include 
            <log4cplus/configurator.h>
            #include 
            <iostream>
            #include 
            <log4cplus/consoleappender.h>
            #include 
            <log4cplus/layout.h>
            #include 
            <conio.h>
            #include 
            <log4cplus/helpers/sleep.h>

            using namespace log4cplus;
            using namespace log4cplus::helpers;  

            int _tmain(int argc, _TCHAR* argv[]){   
                
            /* step 1: Instantiate an appender object */   
                SharedObjectPtr
            <Appender> _append (new ConsoleAppender());    
                _append
            ->setName(LOG4CPLUS_TEXT("append for test"));   
                
            /* step 2: Instantiate a layout object */    
                
            //std::string pattern = ;   
                std::auto_ptr<Layout> _layout(new PatternLayout(LOG4CPLUS_TEXT("%d{%m/%d/%y %H:%M:%S}  - %m [%l]%n")));   
                
            /* step 3: Attach the layout object to the appender */   
                _append
            ->setLayout( _layout );   
                
            /* step 4: Instantiate a logger object */   
                Logger _logger 
            = Logger::getInstance(LOG4CPLUS_TEXT("test"));  
                
            /* step 5: Attach the appender object to the logger  */  
                _logger.addAppender(_append);   
                
            /* step 6: Set a priority for the logger  */   
                _logger.setLogLevel(ALL_LOG_LEVEL);   
                
            /* log activity */    
                LOG4CPLUS_DEBUG(_logger, 
            "This is the FIRST log message");
                sleep(
            1);   
                LOG4CPLUS_WARN(_logger, 
            "This is the SECOND log message"); 
                
                _getch();
                
            return 0;
            }

            (2) 簡潔使用模式,appender輸出到屏幕
            #include "stdafx.h"
            #pragma comment(lib,
            "../bin/log4cplusD.lib")

            #include 
            <log4cplus/logger.h>
            #include 
            <log4cplus/configurator.h>
            #include 
            <iostream>
            #include 
            <log4cplus/consoleappender.h>
            #include 
            <log4cplus/layout.h>
            #include 
            <conio.h>
            #include 
            <log4cplus/helpers/sleep.h>

            using namespace log4cplus;
            using namespace log4cplus::helpers;  

            int _tmain(int argc, _TCHAR* argv[]){   
                
                
            /* step 1: Instantiate an appender object */    
                SharedAppenderPtr _append(
            new ConsoleAppender());    
                _append
            ->setName(LOG4CPLUS_TEXT("append test"));    
                
                
            /* step 4: Instantiate a logger object */    
                Logger _logger 
            = Logger::getInstance(LOG4CPLUS_TEXT("test"));    
                
                
            /* step 5: Attach the appender object to the logger  */    
                _logger.addAppender(_append);    
                
                
            /* log activity */    
                LOG4CPLUS_DEBUG(_logger, 
            "This is the FIRST log message");
                sleep(
            1);
                LOG4CPLUS_WARN(_logger, 
            "This is the SECOND log message");   
                
                _getch();
                
            return 0;
            }


            (3)簡潔使用模式,appender輸出到屏幕
            #include "stdafx.h"
            #pragma comment(lib,
            "../bin/log4cplusD.lib")

            #include 
            <log4cplus/logger.h>
            #include 
            <log4cplus/configurator.h>
            #include 
            <iostream>
            #include 
            <log4cplus/consoleappender.h>
            #include 
            <log4cplus/layout.h>
            #include 
            <conio.h>
            #include 
            <log4cplus/helpers/sleep.h>

            using namespace log4cplus;
            using namespace log4cplus::helpers;  
            using namespace std;
            int _tmain(int argc, _TCHAR* argv[]){   
                
                
                
            /* step 1: Instantiate an appender object */    
                SharedAppenderPtr _append(
            new ConsoleAppender());   
                _append
            ->setName(LOG4CPLUS_TEXT("append test"));    
                
                
            /* step 4: Instantiate a logger object */    
                Logger _logger 
            = Logger::getInstance(LOG4CPLUS_TEXT("test"));    
                
                
            /* step 5: Attach the appender object to the logger  */    
                _logger.addAppender(_append);    
                
                
            /* log activity */    
                LOG4CPLUS_TRACE(_logger, 
            "This is"  << " just a t" << "est." << std::endl) ;  //不會被打印 
                LOG4CPLUS_DEBUG(_logger, "This is a bool: " << true);    
                LOG4CPLUS_INFO(_logger, 
            "This is a char: " << 'x') ;   
                LOG4CPLUS_WARN(_logger, 
            "This is a int: " << 1000) ;   
                LOG4CPLUS_ERROR(_logger, 
            "This is a long(hex): " << std::hex << 100000000) ;   
                LOG4CPLUS_FATAL(_logger, 
            "This is a double: "   << 1.2345234234);
                
                _getch();
                
            return 0;
            }

            (4)通過loglog來控制輸出調試、警告或錯誤信息,appender輸出到屏幕。
            #include "stdafx.h"
            #pragma comment(lib,
            "../bin/log4cplusD.lib")

            #include 
            <log4cplus/logger.h>
            #include 
            <log4cplus/configurator.h>
            #include 
            <iostream>
            #include 
            <log4cplus/consoleappender.h>
            #include 
            <log4cplus/layout.h>
            #include 
            <conio.h>
            #include 
            <log4cplus/helpers/sleep.h>
            #include 
            <log4cplus/helpers/loglog.h>

            using namespace log4cplus;
            using namespace log4cplus::helpers;  
            using namespace std;

            void printMsgs(void){    
                std::cout 
            << "Entering printMsgs()" << std::endl;    
                LogLog::getLogLog()
            ->debug(LOG4CPLUS_TEXT("This is a Debug statement"));    
                LogLog::getLogLog()
            ->warn(LOG4CPLUS_TEXT("This is a Warning"));    
                LogLog::getLogLog()
            ->error(LOG4CPLUS_TEXT("This is a Error"));    
                std::cout 
            << "Exiting printMsgs()" << std::endl << std::endl;
            }



            int _tmain(int argc, _TCHAR* argv[]){   
                
            /*       
                LogLog類實現了debug, warn, error 函數用于輸出調試、警告或錯誤信息,       
                同時提供了兩個方法來進一步控制所輸出的信息,其中:
                setInternalDebugging方法用來控制是否屏蔽輸出信息中的調試信息,當輸
                入參數為false則屏蔽,缺省設置為    false。
                setQuietMode方法用來控制是否屏蔽所有輸出信息,當輸入參數為true則屏蔽,
                缺省設置為false。 
                LogLog::getLogLog()->setInternalDebugging(false);   
            */

                
                
            //默認級別是不打印debug信息
                printMsgs();    
                std::cout 
            << "Turning on debug" << std::endl;    
                LogLog::getLogLog()
            ->setInternalDebugging(true);    
                
                
            //打開debug方式
                
            //全部打印
                printMsgs();    
                std::cout 
            << "Turning on quiet mode" << std::endl;    
                LogLog::getLogLog()
            ->setQuietMode(true);    
                
                
            //屏蔽所有輸出信息,所以不全打印各種級別信息
                printMsgs();

                _getch();
                
            return 0;
            }


            /*輸入結果如下:
            Entering printMsgs()
            log4cplus:WARN This is a Warning
            log4cplus:ERROR This is a Error
            Exiting printMsgs()

            Turning on debug
            Entering printMsgs()
            log4cplus: This is a Debug statement
            log4cplus:WARN This is a Warning
            log4cplus:ERROR This is a Error
            Exiting printMsgs()

            Turning on quiet mode
            Entering printMsgs()
            Exiting printMsgs()
            都有個log4cplus:打頭,可以自定義修改以下部分代碼
            LogLog::LogLog() : mutex(LOG4CPLUS_MUTEX_CREATE),   debugEnabled(false),  
             quietMode(false),   PREFIX( LOG4CPLUS_TEXT("log4cplus: ") ),  
              WARN_PREFIX( LOG4CPLUS_TEXT("log4cplus:WARN ") ),   
              ERR_PREFIX( LOG4CPLUS_TEXT("log4cplus:ERROR ") ){}
            */


            (5)文件模式,appender輸出到文件
            #include "stdafx.h"
            #pragma comment(lib,
            "../bin/log4cplusD.lib")

            #include 
            <log4cplus/logger.h>
            #include 
            <log4cplus/fileappender.h>
            #include 
            <conio.h>

            using namespace log4cplus;
            int _tmain(int argc, _TCHAR* argv[]){   
                
                
            /* step 1: Instantiate an appender object */    
                SharedAppenderPtr _append(
            new FileAppender(LOG4CPLUS_TEXT("Test.log")));    
                _append
            ->setName(LOG4CPLUS_TEXT("file log test"));    
                
                
            /* step 4: Instantiate a logger object */    
                Logger _logger 
            = Logger::getInstance(LOG4CPLUS_TEXT("test.subtestof_filelog"));    
                
                
            /* step 5: Attach the appender object to the logger  */   
                _logger.addAppender(_append);    
                
                
            /* log activity */    
                
            int i;    
                
            for( i = 0; i < 5++i ) 
                
            {        
                    LOG4CPLUS_DEBUG(_logger, 
            "Entering loop #" << i << "End line #");
                }

                
                _getch();

            }

            一、簡介:

            log4cplus是C++編寫的開源的日志系統. 具有線程安全、靈活、以及多粒度控制的特點,通過將信息劃分優先級使其可以面向程序調試、運行、測試、和維護等全生命周期; 你可以選擇將信息輸出到屏幕、文件、NT event log、甚至是遠程服務器;通過指定策略對日志進行定期備份等等。 

            二、基本要素

            將log4cplus文件夾下的msvc10文件夾拷貝出來,使用VS10打開工程,編譯源代碼和用例。

            Layouts:布局器,控制輸出消息的格式。

            Appenders:掛接器,與布局器緊密配合,將特定格式的消息輸出到所掛接

            的設備終端如屏幕,文件等等)。

            Logger:記錄器,保存并跟蹤對象日志信息變更的實體,當你需要對一個對

            象進行記錄時,就需要生成一個logger。

            Categories:分類器,層次化(hierarchy)的結構,用于對被記錄信息的

            分類,層次中每一個節點維護一個logger的所有信息。

            Priorities:優先權,包括TRACE, DEBUG, INFO, WARNING, ERROR, FATAL。

            三、基本使用
            使用log4cplus的六個步驟:

            1. 實例化一個appender對象: new ConsoleAppender();

            2. 實例化一個layout對象:new PatternLayout(格式);

            3. 將layout對象綁定(attach)到appender對象:

            appender->setLayout(layout);

                4. 實例化一個logger對象,調用靜態函數:

            log4cplus ::Logger ::getInstance("logger_name");        

                5. 將appender對象綁定(attach)到logger對象:

            logger.addAppender(appender),如省略此步驟,標準輸出(屏幕)appender

            對象會綁定到logger;

                6. 設置logger的優先級: logger.setLogLevel(ALL_LOG_LEVEL),如

            省略此步驟,各種有限級的消息都將被記錄。

            例如:

            1、appender輸出到屏幕:

            LOG4CPLUS_DEBUG(logger,"This is the FIRST log message...");

            sleep(1);    

            LOG4CPLUS_WARN(logger,"This is the SECOND log message...");

            2、iostream模式,appender輸出到屏幕:

                              LOG4CPLUS_INFO(logger,"This is a char: " << 'x');

                LOG4CPLUS_ERROR(logger, "This is a long( hex ): " << std::hex <<

               100000000);

                LOG4CPLUS_FATAL(logger, "This is a double: " <<

               std::setprecision(15) << 1.2345234234);

                3、調試模式,通過loglog來控制輸出調試、警告或錯誤信息,appender輸出到屏幕:

                LogLog::getLogLog()->debug("This is a Debug statement...");

              LogLog::getLogLog()->warn("This is a Warning...");

              LogLog::getLogLog()->error("This is a Error...");

                LogLog::getLogLog()->setInternalDebugging(true);

                LogLog::getLogLog()->setQuietMode(true);

                LogLog類實現了debug, warn, error 函數用于輸出調試、警告或錯誤信息,同時提供了兩個方法來進一步控制所輸出的信息,其中:setInternalDebugging方法用來控制是否屏蔽輸出信息中的調試信息,當輸入參數為false則屏蔽,缺省設置為false;setQuietMode方法用來控制是否屏蔽所有輸出信息,當輸入參數為true則屏蔽,缺省設置為false。

            注:LogLog在實現時,寫死了輸出信息前綴:

            LogLog::LogLog():mutex(LOG4CPLUS_MUTEX_CREATE),

                               debugEnabled(false),quietMode(false),

                                PREFIX( LOG4CPLUS_TEXT("log4cplus: ")),

                                WARN_PREFIX( LOG4CPLUS_TEXT("log4cplus:WARN ")), ERR_PREFIX( LOG4CPLUS_TEXT("log4cplus:ERROR "))

            {

            }

               4、文件模式,appender輸出到文件:

               SharedAppenderPtr _append(new FileAppender("Test.log"));

              _append->setName("filelog");

               Logger _logger = Logger::getInstance("test.subtestof_filelog");

              _logger.addAppender(_append);

              LOG4CPLUS_DEBUG(_logger,"Entering text");

            四、輸出格式

                1、SimpleLayout是一種簡單格式的布局器,在輸出的原始信息之前加上LogLevel和一個"-"。

               std::auto_ptr _layout(new log4cplus::SimpleLayout());

               2、PatternLayout是一種有詞法分析功能的模式布局器,一提起模式就會想起正則表達式,這里的模式和正則表達式類似,但是遠比后者簡單,能夠對預定義的標識符進行解析,轉換成特定格式輸出。

               std::string pattern = "%d{%m/%d/%y %H:%M:%S} - %m [%l] %n";

              std::auto_ptr _layout(new PatternLayout(pattern));

            注:

            1、"pattern"可以包含普通字符串和預定義的標識符,其中:

            (1)普通字符串,能夠被直接顯示的信息;

            (2)預定義標識符,通過"%"與一個或多個字符共同構成預定義的標識符,

            能夠產生出特定格式信息。

            2、各種消息格式:

               (1)"%%",轉義為%;

               (2)"%c{n}",輸出logger名稱,也可以控制logger名稱的顯示層次其中數字表示層次。

               (3)"%D",顯示本地時間,%d顯示標準時間,可以通過%d{...}定義更詳細的顯示格式,比如%d{%H:%M:%s}表示要顯示小時:分鐘:秒。大括號中可顯示的預定義標識符如下:

            %a -- 表示禮拜幾,英文縮寫形式,比如"Fri"

            %A -- 表示禮拜幾,比如"Friday"

            %b -- 表示幾月份,英文縮寫形式,比如"Oct"

            %B -- 表示幾月份,"October"

            %c -- 標準的日期+時間格式,如 "Sat Oct 16 18:56:19 2004"

            %d -- 表示今天是這個月的幾號(1-31)"16"

            %H -- 表示當前時刻是幾時(0-23),如 "18"

            %I -- 表示當前時刻是幾時(1-12),如 "6"

            %j -- 表示今天是哪一天(1-366),如 "290"

            %m -- 表示本月是哪一月(1-12),如 "10"

            %M -- 表示當前時刻是哪一分鐘(0-59),如 "59"

            %p -- 表示現在是上午還是下午, AM or PM

            %q -- 表示當前時刻中毫秒部分(0-999),如 "237"

            %Q -- 表示當前時刻中帶小數的毫秒部分(0-999.999),如 "430.732"

            %S -- 表示當前時刻的多少秒(0-59),如 "32"

            %U -- 表示本周是今年的第幾個禮拜,以周日為第一天開始計算(0-53)。

            %w -- 表示禮拜幾,(0-6, 禮拜天為0),如 "6"

            %W -- 表示本周是今年的第幾個禮拜,以周一為第一天開始計算(0-53)。

            %x -- 標準的日期格式,如 "10/16/04"

            %X -- 標準的時間格式,如 "19:02:34"

            %y -- 兩位數的年份(0-99),如 "04"

            %Y -- 四位數的年份,如 "2004"

            %Z -- 時區名,比如 "GMT"

                (4)"%F",輸出當前記錄器所在的文件名稱;

            (5)"%L",輸出當前記錄器所在的文件行號;

            (6)"%l",輸出當前記錄器所在的文件名稱和行號;

            (7)"%m",輸出原始信息,這種實現機制可以確保原始信息被嵌入到帶格式的信息中。

            (8)"%n",換行符;

            (9)"%p",輸出LogLevel;

            (10)"%t",輸出記錄器所在的線程ID

            (11)"%x",嵌套診斷上下文NDC輸出,從堆棧中彈出上下文信息,NDC可以用對不同源的log信息(同時地)交叉輸出進行區分。

            (12)格式對齊:"%-10m"時表示左對齊,寬度是10。

               3、TTCCLayout是在PatternLayout基礎上發展的一種缺省的帶格式輸出的布局器,其格式由時間,線程ID,Logger和NDC 組成,其在構造時選擇顯示本地時間(默認false)或GMT時間

            五、文件操作類

            log4cplus提供了FileAppender類、DailyRollingFileAppender類和RollingFileAppender類用于文件操作:

            1、FileAppender類實現了基本的文件操作功能,構造函數如下:

            FileAppender(const log4cplus::tstring& filename ,

                        LOG4CPLUS_OPEN_MODE_TYPE mode =

                        LOG4CPLUS_FSTREAM_NAMESPACE::ios::trunc,

                        bool immediateFlush = true);

            filename: 文件名;

            mode: 文件類型,可選擇的文件類型包括app、ate、binary、in、out、trunc,缺省是trunc,表示將先前文件刪除。

                immediateFlush :緩沖刷新標志,如果為true表示每向文件寫一條記錄就刷新一次緩存,否則直到FileAppender被關閉或文件緩存已滿才更新文件,默認true。

            2、RollingFileAppender類可以根據預先設定的大小來決定是否轉儲,當超過該大小,后續log信息會另存到新文件中,除了定義每個記錄文件的大小之外,還要確定在RollingFileAppender類對象構造時最多需要多少個這樣的記錄文件(maxBackupIndex+1),當存儲的文件數目超過maxBackupIndex+1時,會刪除最早生成的文件,保證整個文件數目等于maxBackupIndex+1,然后繼續記錄。

                        構造函數如下:

            log4cplus::RollingFileAppender::RollingFileAppender(

                            const log4cplus::tstring& filename, long maxFileSize,

                            int maxBackupIndex, bool immediateFlush);

            filename : 文件名
            maxFileSize : 文件的最大尺寸,尺寸小于200k時等于200k;

            maxBackupIndex : 最大記錄文件數

            immediateFlush : 緩沖刷新標志

               SharedAppenderPtr _append(new RollingFileAppender("Test.log", size

                                            * n, size));

            3、DailyRollingFileAppender類可以根據你預先設定的頻度來決定是否轉儲,當超過該頻度,后續log信息會另存到新文件中,這里的頻度包括:MONTHLY (每月)、WEEKLY(每周)、DAILY(每日)、TWICE_DAILY(每兩天)、HOURLY(每時)、MINUTELY(每分)。構造函數如下:

            DailyRollingFileAppender::DailyRollingFileAppender(

                                             const log4cplus::tstring& filename,

                                             DailyRollingFileSchedule schedule,

                                             bool immediateFlush,

                                     int maxBackupIndex);

            filename : 文件名

            schedule : 存儲頻度

            immediateFlush : 緩沖刷新標志

            maxBackupIndex : 最大記錄文件數

            SharedAppenderPtr _append(new DailyRollingFileAppender("Test.log",

                                                      MINUTELY, true, 5));

            五、進階

                通過LogLevelManager、LogLog、Filter三種方式,實現任意時刻輸出的LogLevel的信息。

            1、背景知識:

                 log4cplus中logger的存儲機制是通過一個層次化的結構(如:hash表)來組織的。

                 獲取Root級別的logger: Logger::getRoot();

                 自定義的logger:Logger::getInstance("test");

            定義其子logger: Logger::getInstance("test.subtest");

            設置其LogLevel: Test.setLogLevel( ... );

                 subTest.setLogLevel( ... );

                 log4cplus將輸出的log信息按照LogLevel(從低到高)分為:

                 NOT_SET_LOG_LEVEL(-1) :接受缺省的LogLevel,如果有父logger則繼承它的LogLevel;

                 ALL_LOG_LEVEL(0) :開放所有log信息輸出;

            TRACE_LOG_LEVEL(0) :開放trace信息輸出(即ALL_LOG_LEVEL);

            DEBUG_LOG_LEVEL(10000) :開放debug信息輸出;

            INFO_LOG_LEVEL(20000) :開放info信息輸出;

            WARN_LOG_LEVEL(30000) :開放warning信息輸出;

            ERROR_LOG_LEVEL(40000) :開放error信息輸出;

            FATAL_LOG_LEVEL(50000) :開放fatal信息輸出;

            OFF_LOG_LEVEL(60000) :關閉所有log信息輸出;

                2、LogLevelManager負責設置logger的優先級,各logger通過setLogLevel設置自己的優先級,當某個logger的LogLevel設置成NOT_SET_LOG_LEVEL時,該logger會繼承父logger的優先級,另外,如果定義了重名的多個logger, 對其中任何一個的修改都會同時改變其它logger。

            例1:

                SharedAppenderPtr _append(new ConsoleAppender());

              _append->setName("test");

               Logger root = Logger::getRoot();

              root.addAppender(_append);

                Logger test = Logger::getInstance("test");

              Logger subTest = Logger::getInstance("test.subtest");

              LogLevelManager& llm = getLogLevelManager();

                test.setLogLevel(INFO_LOG_LEVEL);

                LOG4CPLUS_FATAL(root,"root:"<<llm.toString(root.getChainedLogLevel()));

            LOG4CPLUS_FATAL(root,"test:"<<llm.toString(test.getChainedLogLevel()));

            LOG4CPLUS_FATAL(root,"test.subtest:"<<llm.toString(subTest.getChainedLogLevel()));

            例2:通過設置LogLevel來控制用戶的log信息輸出:

                  一下級別逐漸升高:

            LOG4CPLUS_TRACE(Logger::getRoot(),"info")

            LOG4CPLUS_DEBUG(Logger::getRoot(),"info")

            LOG4CPLUS_INFO(Logger::getRoot(),"info")

            LOG4CPLUS_WARN(Logger::getRoot(),"info")

            LOG4CPLUS_ERROR(Logger::getRoot(),"info")

            LOG4CPLUS_FATAL(Logger::getRoot(),"info")

            Logger root = Logger::getRoot();

            root.setLogLevel(ALL_LOG_LEVEL);   //全部顯示

            root.setLogLevel(TRACE_LOG_LEVEL); //全部顯示

            root.setLogLevel(ERROR_LOG_LEVEL); //只顯示ERROR、FATAL

            root.setLogLevel(OFF_LOG_LEVEL);   //顯示log disabled

             

                3、自行定義LogLevel:

                   定義NEW_LOG_LEVEL:

                   //DEBUG_LOG_LEVEL  < NEW_LOG_LEVEL < INFO_LOG_LEVEL

                   const LogLevel NEW_LOG_LEVEL = 15000;

                   定義宏:

                   #define LOG4CPLUS_NEW(logger, logEvent) \

            if(logger.isEnabledFor(NEW_LOG_LEVEL)) { \

              log4cplus::tostringstream _log4cplus_buf; \

              _log4cplus_buf << logEvent; \

              logger.forcedLog(NEW_LOG_LEVEL, _log4cplus_buf.str(),   

                  __FILE__, __LINE__);}

                  在loglevel.cxx中加入#define _HELLO_STRING LOG4CPLUS_TEXT("HELLO") 然后修改log4cplus::tstring defaultLogLevelToStringMethod(LogLevel ll)函數,增加一個判斷:case HELLO_LOG_LEVEL:return _HELLO_STRING;重新編譯log4cplus源代碼。

                4、基于腳本配置來過濾log信息:

                 log4cplus通過PropertyConfigurator類實現基于腳本配置實現對logger、appender和layout的配置及log環境的配置(通過程序也可以)。從而過濾log信息及利用腳本配置來配合實現性能測試,

            腳本語法規則:

            1、Appender的配置語法:

            (1)設置名稱:

            //設置方法

            log4cplus.appender.appenderName=fully.qualified.name.of.appender.class

            例如:

            log4cplus.appender.append_1=log4cplus::ConsoleAppender

            log4cplus.appender.append_2=log4cplus::FileAppender

            log4cplus.appender.append_3=log4cplus::RollingFileAppender

            log4cplus.appender.append_4=log4cplus::DailyRollingFileAppender

            log4cplus.appender.append_4=log4cplus::SocketAppender

            (2)設置Filter:

            過濾器:LogLevelMatchFilter、LogLevelRangeFilter、StringMatchFilter。

             

                    LogLevelMatchFilter:過濾條件包括LogLevelToMatch和

            AcceptOnMatch(true|false), 只有當log信息的LogLevel值與

            LogLevelToMatch相同,且AcceptOnMatch為true時才會匹配。

                    LogLevelRangeFilter:過濾條件包括LogLevelMin、LogLevelMax和

            AcceptOnMatch,只有當log信息的LogLevel在LogLevelMin、LogLevelMax之間同時AcceptOnMatch為true時才會匹配。

                    StringMatchFilter:過濾條件包括StringToMatch和AcceptOnMatch,

            只有當log信息的LogLevel值與StringToMatch對應的LogLevel值相同,

            且AcceptOnMatch為true時會匹配。

                    過濾條件處理機制:先deny再allow,后寫的條件會被先執行。比如:

            log4cplus.appender.append_1.filters.1=log4cplus::spi::LogLevelMatchFilter

            log4cplus.appender.append_1.filters.1.LogLevelToMatch=TRACE

            log4cplus.appender.append_1.filters.1.AcceptOnMatch=true

            log4cplus.appender.append_1.filters.2=log4cplus::spi::DenyAllFilter

            首先執行filters.2的過濾條件,關閉所有過濾器,然后執行filters.1,僅匹配TRACE信息。

                 (3)設置Layout:不設置(默認)、TTCCLayout、或PatternLayout

            設置TTCCLayout:

                log4cplus.appender.ALL_MSGS.layout=log4cplus::TTCCLayout

            設置PatternLayout:

            log4cplus.appender.append_1.layout=log4cplus::PatternLayout

            log4cplus.appender.append_1.layout.ConversionPattern=%d{%m/%d/%y %H:%M:%S,%Q} [%t] %-5p - %m%n               

            2、logger的配置語法:rootLogger和non-root logger。

                rootLogger:

                  log4cplus.rootLogger=[LogLevel], appenderName, appenderName, ...

            non-root logger:

                   log4cplus.logger.logger_name=[LogLevel|INHERITED], appenderName, appenderName, ...

              腳本方式使用:加載urconfig.properties自定義的配置文件。

                    PropertyConfigurator::doConfigure("urconfig.properties");

            例:

            //定義

                log4cplus.rootLogger=TRACE, ALL_MSGS, TRACE_MSGS, DEBUG_INFO_MSGS, FATAL_MSGS

            log4cplus.appender.FATAL_MSGS=log4cplus::RollingFileAppender

            log4cplus.appender.FATAL_MSGS.File=fatal_msgs.log

            log4cplus.appender.FATAL_MSGS.layout=log4cplus::TTCCLayout

            log4cplus.appender.FATAL_MSGS.filters.1=log4cplus::spi::StringMatchFilter

            log4cplus.appender.FATAL_MSGS.filters.1.StringToMatch=FATAL

            log4cplus.appender.FATAL_MSGS.filters.1.AcceptOnMatch=true

            log4cplus.appender.FATAL_MSGS.filters.2=log4cplus::spi::DenyAllFilter

            //加載

              Logger root = Logger::getRoot();

              PropertyConfigurator::doConfigure("urconfig.properties");

            六、嵌入診斷上下文

                NDC是線程特有的,利用了線程局部存儲機制,稱為線程私有數據(Thread-specificData,或TSD)。

                 (1)默認格式輸出NDC:

            NDC& ndc = log4cplus::getNDC();

            ndc.push("ur ndc string");

            ndc.pop();

            ndc.remove();

            (2)自定義的輸出格式中使用NDC(用%x):

            std::string pattern = "NDC:[%x]  - %m %n";

            std::auto_ptr<layout></layout> _layout(new PatternLayout(pattern));

            NDC& ndc = log4cplus::getNDC();
            ndc.push("ur ndc string");

            ndc.pop();

            ndc.remove();

            (3)線程中直接用NDCContextCreator,不必顯式地調用push/pop了,而且當出現異常時,能夠確保push與pop的調用是匹配的。

            NDCContextCreator _first_ndc("ur ndc string");

            七、線程

            log4cplus的線程沒有考慮同步、死鎖,有互斥,使用時派生類中直接重載run函數。如下:

            class TestThread : public AbstractThread

            {

            public:

             virtual void run();

            };                              

            void TestThread::run()

            {

            }

            八、套接字

            定義在namespace log4cplus::helpers中,實現了C/S方式的日志記錄。

            1、 客戶端程序需要做的工作:

                //定義一個SocketAppender類型的掛接器:

                   SharedAppenderPtr _append(new SocketAppender(host, 8888, "ServerName"));

                //把_append加入到logger中:

                   Logger::getRoot().addAppender(_append);

            注:SocketAppender類型不需要Layout,直接調用宏將信息發往loggerServer。

            對宏的調用其實是調用了SocketAppender::append,里面有一個數據傳輸約定,即先發送一個后續數據的總長度,然后再發送實際的數據。如下:

                SocketBuffer buffer = convertToBuffer(event, serverName);

                SocketBuffer msgBuffer(LOG4CPLUS_MAX_MESSAGE_SIZE);

                msgBuffer.appendSize_t(buffer.getSize());

                msgBuffer.appendBuffer(buffer);                 

            2、服務器端程序需要做的工作:

                 //定義一個ServerSocket

              ServerSocket serverSocket(port);

                 //調用accept函數創建一個新的socket與客戶端連接

                   Socket sock = serverSocket.accept();

                 //進行數據read/write

            SocketBuffer msgSizeBuffer(sizeof(unsigned int));

            if(!clientsock.read(msgSizeBuffer))

            {

                return;

            }

            unsigned int msgSize = msgSizeBuffer.readInt();

            SocketBuffer buffer(msgSize);

            if(!clientsock.read(buffer))

            {

                return;

            }

            注:為了將讀到的數據正常顯示出來,需要將SocketBuffer存放的內容轉換成InternalLoggingEvent格式:spi::InternalLoggingEvent event = readFromBuffer(buffer);然后輸出:Logger logger = Logger::getInstance(event.getLoggerName());logger.callAppenders(event);     read/write是按照阻塞方式實現的,對其調用直到滿足了所接收或發送的個數才返回。


            posted on 2011-04-02 15:25 C++技術中心 閱讀(12556) 評論(0)  編輯 收藏 引用 所屬分類: 三方庫
            久久久久亚洲av毛片大| 久久精品亚洲福利| 精品综合久久久久久97超人| 久久久不卡国产精品一区二区| 国产成人AV综合久久| 精品国产91久久久久久久| 99久久国产热无码精品免费久久久久| 久久亚洲日韩精品一区二区三区| 思思久久99热免费精品6| 久久se精品一区精品二区国产| 亚洲国产二区三区久久| 亚洲精品无码久久毛片| 四虎国产精品成人免费久久| 久久人妻少妇嫩草AV无码专区| 97久久国产亚洲精品超碰热 | 麻豆av久久av盛宴av| 久久久亚洲精品蜜桃臀| 久久综合狠狠综合久久综合88| 精品欧美一区二区三区久久久| 久久免费的精品国产V∧| 久久伊人亚洲AV无码网站| 久久青青草原国产精品免费| 7国产欧美日韩综合天堂中文久久久久| 亚洲精品97久久中文字幕无码| 久久国产精品一区二区| 亚洲国产精品无码久久久秋霞2| 无码人妻久久一区二区三区| 久久一区二区三区99| 国产精品xxxx国产喷水亚洲国产精品无码久久一区 | 亚洲欧美日韩精品久久亚洲区| 国产精品久久久久久搜索| 久久久久久久久久久久中文字幕| 久久久精品国产| 久久国产精品一国产精品金尊| 免费无码国产欧美久久18| 亚洲国产成人精品91久久久| 久久久久国产精品麻豆AR影院| 国产无套内射久久久国产| 99久久国产综合精品五月天喷水| 久久精品国产91久久麻豆自制| 99久久超碰中文字幕伊人|