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

            Log4cpp學習記錄

            Posted on 2008-09-09 17:35 美洲豹 閱讀(5633) 評論(1)  編輯 收藏 引用

            Log4cpp學習記錄

            1.       下載

            http://log4cpp.sourceforge.net/

            2.       編譯(這一步一開始搞了比較久,后來搜到如下的信息幫助解決了)

            問題:由于log4cpp-0.3.5rc3僅提供了vc6的工程文件,因此,使用vs2005打開后,需要進行轉(zhuǎn)換。但是轉(zhuǎn)換后,不能正確編譯,提示Custom Build Step時出現(xiàn)了錯誤。

            分 析:因為log4cpp在生成NTEventLogAppender.dll時,需要連接NTEventLogCategories.mc文件。所以,項 目設(shè)置了自定義的生成步驟去生成NTEventLogAppender.dll。但從vc6的工程文件轉(zhuǎn)換時,這些步驟卻沒有正確的轉(zhuǎn)換過來。從而出現(xiàn)上 述問題。

            解決方法:重新填寫Custom Build Step項。

            其中,CommandLine填寫以下內(nèi)容:

            if not exist $(OutDir) md $(OutDir)
            "mc.exe" -h $(OutDir) -r $(OutDir) $(ProjectDir)..\$(InputName).mc
            "RC.exe" -r -fo $(OutDir)\$(InputName).res $(OutDir)\$(InputName).rc
            "link.exe" /MACHINE:IX86 -dll -noentry -out:$(OutDir)\NTEventLogAppender.dll $(OutDir)\$(InputName).res




            適用范圍:log4cpp項目、log4cppDLL項目的DebugRelease配置。同時,該方法適用于vs2003(vc7.1)

            問題:log4cppDLL項目編譯時會報8個連接錯誤,提示符號std::_Tree找不到
            解決方案:
            include\log4cpp\FactoryParams.hh文件中的

            const_iterator find(const std::string& t) const;


            修改為

            const_iterator find(const std::string& t) const { return storage_.find(t); }


            后重新編譯

            問題:log4cppDLL項目編譯時會報1個連接錯誤,提示符號log4cpp::localtime找不到
            解決方案:
            src\localtime.cpp文件添加到項目中重新編譯

             

            3.       使用

            http://www-128.ibm.com/developerworks/cn/linux/l-log4cpp/index.html

            log4cpp應(yīng)用手冊

            1
            下載log4cpp并解壓。

            2
            打開\log4cpp-0.3.4b\msvc6\msvc6.dsw
             
            編譯log4cpp工程Release版。
             
            3
            將編譯后的log4cpp.lib復制到VCLib目錄中。

            4
            將頭文件的目錄log4cpp-0.3.4b\include\log4cpp\
             
            復制到VCInclude目錄.
              (
            或者添加log4cpp-0.3.4b\includeVCInclude環(huán)境變量)

            6
            目標工程包含庫
            log4cpp.lib ws2_32.lib
            (要選擇庫連接方式相同的庫)

            5
            包含頭文件
            日志記錄
            #include <log4cpp/Category.hh>
            日志配置讀取
            #include <log4cpp/PropertyConfigurator.hh>
            NDC
            #include <log4cpp/NDC.hh>

            9
            日志代碼
            每個類可以有自己的類別(log4cpp::Category)
            可以在配置文件中添加該類別并設(shè)置日志級別。
            所有的log4cpp::Category都使用同一個Appender
            不同的Category配置為不同的日志級別,就可以控制日志輸出的范圍。
            一般只使用四個記錄日志級:DEBUGINFOWARNERROR
            如:
            log4cpp::Category::getRoot().info("Now run line %d", __LINE__);
            或使用非根類別
            log4cpp::Category::getInstance("MyCat").info("Now run line %d", __LINE__);

            使用流:
            log4cpp::Category::getInstance("main_cat").infoStream()
                << "This will show up as "
                << 1 << " emergency message"
                << log4cpp::CategoryStream::ENDLINE;
               

            具體的函數(shù)說明見api文檔.

            7
            讀取配置代碼
            讀取log配置文件,應(yīng)在log4cpp靜態(tài)成員初始化之后。
            如在CXXXApp::InitInstance()

                try
                {
                    log4cpp::PropertyConfigurator::configure("log.ini");
                }
                catch (log4cpp::ConfigureFailure e)
                {
                    log4cpp::Category::getRoot().warn(e.what());
                }

               

            8
            配置文件

            [log4cpp]
            # Set root category priority to DEBUG and its only appender to A1. 
            # priority enum: "FATAL", "ALERT", "CRIT", "ERROR", "WARN",
            #            "NOTICE", "INFO", "DEBUG", "NOTSET", "UNKNOWN"
            rootCategory=DEBUG,A1
            additivity.rootCategory=false
                           
            # define appender
            appender.A1=RollingFileAppender
            #appender.A1.threshold=NOTSET
            appender.A1.fileName=XXXX.log
            #appender.A1.maxFileSize=10485760
            #appender.A1.maxBackupIndex=1
            appender.A1.layout=PatternLayout
            appender.A1.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S}](%p)%c %x: %m%n

            appender.Info_Cons=ConsoleAppender
            appender.Info_Cons.threshold=INFO
            appender.Info_Cons.layout=PatternLayout
            appender.Info_Cons.layout.ConversionPattern=[%d{%Y-%m-%d %H:%M:%S}](%p)%c %x: %m%n

            # category for sub1
            category.sub1=DEBUG,A1,Info_Cons
            additivity.sub1=false
            category.sub2=INFO,A1
            additivity.sub1=false

            # other categories

            [others]
            djkf=dksajf

             

             

            最基本的使用方法;

            手動使用log4cpp的基本步驟如下:

            1. 實例化一個layout 對象;
            2. 初始化一個appender 對象;
            3. layout對象附著在appender對象上;
            4. 調(diào)用log4cpp::Category::getInstance("name"). 實例化一個category對象;
            5. appender對象附到category上(根據(jù)additivity的值取代其他appender或者附加在其他appender后)。
            6. 設(shè)置category的優(yōu)先級;
            // FileName: test_log4cpp1.cpp
            // Test log4cpp by manual operation.
            // Announce: use as your own risk.
            // Compile : g++ -otest1 -llog4cpp test_log4cpp1.cpp
            // Run     : ./test1
            // Tested  : RedHat 7.2 log4cpp0.3.4b
            // Author  : liqun (liqun@nsfocus.com)
            // Data    : 2003-6-27
            #include       "log4cpp/Category.hh"
            #include       "log4cpp/FileAppender.hh"
            #include       "log4cpp/BasicLayout.hh"
            int main(int argc, char* argv[])
            {
                    // 1實例化一個layout 對象
                    log4cpp::Layout* layout = 
                    new log4cpp::BasicLayout();
                    // 2. 初始化一個appender 對象
                    log4cpp::Appender* appender = new 
                          log4cpp::FileAppender("FileAppender",
                          "./test_log4cpp1.log");
                    // 3. layout對象附著在appender對象上
                    appender->setLayout(layout);
                    // 4. 實例化一個category對象
                    log4cpp::Category& warn_log = 
                    log4cpp::Category::getInstance("mywarn");
                    // 5. 設(shè)置additivityfalse,替換已有的appender
                    warn_log.setAdditivity(false);
                    // 5. appender對象附到category
                    warn_log.setAppender(appender);
                    // 6. 設(shè)置category的優(yōu)先級,低于此優(yōu)先級的日志不被記錄
                    warn_log.setPriority(log4cpp::Priority::WARN);
                    // 記錄一些日志
                    warn_log.info("Program info which cannot be wirten");
                    warn_log.debug("This debug message will fail to write");
                    warn_log.alert("Alert info");
                    // 其他記錄日志方式
                    warn_log.log(log4cpp::Priority::WARN, "This will be a logged warning");
                    log4cpp::Priority::PriorityLevel priority;
                    bool this_is_critical = true;
                    if(this_is_critical)
                           priority = log4cpp::Priority::CRIT;
                    else
                           priority = log4cpp::Priority::DEBUG;
                    warn_log.log(priority,"Importance depends on context");
                    
                    warn_log.critStream() << "This will show up << as " 
                    << 1 << " critical message" 
                    << log4cpp::CategoryStream::ENDLINE;
                    // clean up and flush all appenders
                    log4cpp::Category::shutdown();
                    return 0;
            }

             

            從以上例子,并結(jié)合文檔,可以看出,實際上,其Loglog4cpp::Category::的一部分,而這些Category可以綁定不同的appender,以使得log輸出到不同的出口,如文件或終端或網(wǎng)絡(luò)等。實際記錄的時候是靠優(yōu)先級來實現(xiàn)的,即優(yōu)先級低于目前的log所設(shè)定的優(yōu)先級,則不需要記錄此信息,只有高于當前優(yōu)先級的log信息才會被記錄。對于Category的層次,log4cpp::Category::getRoot()為最高層次,其它getInstance(“name”)得到的只有命名為”name”Category,應(yīng)該是Root()的子層。

            Log4cpp的優(yōu)勢

            1,提供應(yīng)用程序運行上下文,方便跟蹤調(diào)試.這對開發(fā)人員很有幫助,特別是調(diào)試的時候,這一點log均可實現(xiàn).

            2,把記錄的日志輸送到多種方式上.包括命令行,控制臺(調(diào)試的時候馬上就能看到哪里有問題),文件(把完整的日志信息保存起來,以利于整個系統(tǒng)的維護,統(tǒng)計),回卷文件、內(nèi)存等.這一點是有特色的地方,因為其只有一個輸出內(nèi)容,但可綁定到多個輸出源,比如,你可以用控制臺輸出看到即時結(jié)果的同時,將輸出的內(nèi)容存到文件中。或者你為了在測試的時候盡量不影響性能,可以將日志輸出到內(nèi)存,待關(guān)閉程序的時候再將其寫回到硬盤。

            3,可以動態(tài)控制日志記錄級別,在效率和功能中進行調(diào)整.當執(zhí)行等級小于設(shè)定等級時就不輸出.其設(shè)定了INFO,DEBUG,ALERT,EMERGE等不同的級別,當當前Log的級別低于設(shè)定的需記錄的級別時,將忽略此信息,這個對記錄不同程度的信息詳細度有幫助,可以專注于特定的重要級別的錯誤的調(diào)試。

            4,所有配置可以通過配置文件進行動態(tài)調(diào)整.這個暫時還沒有使用,若要使用可參見 《便利的開發(fā)工具-log4cpp快速使用指南》(http://www.ibm.com/developerworks/cn/linux/l-log4cpp/index.html)

            中第三節(jié)

            5,現(xiàn)在log4**系列已經(jīng)開始支持其他語言了.Java(log4j),C++log4cpplog4cplus),Clog4c),pythonlog4p)等.好的東西容易被人借鑒和傳播.

            Log4cpp有三個主要的組件:日志類別(Category)、輸出源( Appenders)和布局(Layouts)。這三種類型的組件一起工作使得開發(fā)員可以根據(jù)信息的類型和級別記錄它們,并且在運行時控制這些信息的輸出格式和位置。

            Feedback

            # re: Log4cpp學習記錄  回復  更多評論   

            2008-11-03 11:55 by 呵呵
            謝謝了..............

            posts - 15, comments - 2, trackbacks - 0, articles - 29

            Copyright © 美洲豹

            久久综合一区二区无码| 国产高潮国产高潮久久久91 | 国产高潮国产高潮久久久| 狠狠色噜噜色狠狠狠综合久久| 精品综合久久久久久97| 97久久超碰国产精品旧版| 国产亚洲色婷婷久久99精品91| 日本加勒比久久精品| 久久精品aⅴ无码中文字字幕不卡| 久久综合九色综合97_久久久 | 日韩影院久久| 精品永久久福利一区二区| 精品精品国产自在久久高清| 国产产无码乱码精品久久鸭| 久久人人爽人人爽人人片AV麻豆| 人妻无码久久一区二区三区免费| 国产午夜精品理论片久久 | 精品久久久久久无码免费| 精品国产日韩久久亚洲| 久久亚洲欧美日本精品| 久久人人爽人人爽人人片AV不| 久久免费小视频| 久久99精品久久久久久hb无码| 最新久久免费视频| 国内精品伊人久久久久网站| 69久久精品无码一区二区| 思思久久99热只有频精品66| 99久久精品免费国产大片| 久久精品国产亚洲av影院| 久久精品国产99国产精品亚洲| 久久免费视频6| 久久久久人妻一区精品果冻| 国产99久久久国产精免费| 日本免费久久久久久久网站| 国内精品久久人妻互换| 久久久亚洲欧洲日产国码二区| 精品无码久久久久国产动漫3d| 2021最新久久久视精品爱 | 久久香蕉国产线看观看精品yw| 久久乐国产综合亚洲精品| 最新久久免费视频|