log4cpp簡單使用及踩到的坑


log4cpp是log4j的一個擴展, C++開發者可用該庫記錄日志,可輸出到終端,亦可保存到文件。

下面簡單demo展示如何輸出日志到輸出終端。

 1 #include <iostream>
 2 #include <log4cpp/Category.hh>
 3 #include <log4cpp/OstreamAppender.hh>
 4 #include <log4cpp/Priority.hh>
 5 #include <log4cpp/PatternLayout.hh>
 6 using namespace std;
 7 
 8 int main(int argc, char const *argv[])
 9 {
10     log4cpp::OstreamAppender app("osAppender", &cout);
11 
12     log4cpp::PatternLayout *layout = new log4cpp::PatternLayout();
13     layout->setConversionPattern("%d: %p %c : %m%n");
14     app.setLayout(layout);
15 
16     log4cpp::Category &root = log4cpp::Category::getRoot();
17     log4cpp::Category &infoCategory = root.getInstance(string(argv[0]));
18         
19     infoCategory.addAppender(app);
20     infoCategory.setPriority(log4cpp::Priority::INFO);
21 
22     infoCategory.info("system is running...");
23     infoCategory.warn("system has got a warn...");
24     infoCategory.error("system has got an error...");
25     infoCategory.fatal("system has crashed....");
26 
27     log4cpp::Category::shutdown();
28     return 0;
29 }

第10行,創建一個輸出器,ostreamAppender(const streing &name, ostream *stream), name為該輸出器的名字,可隨意命名,最好唯一, stream輸出流對象指針

第12-13行,創建一個布局對象,實際功能為定義日志輸出格式: %d-日期, %p-優先級, %c-策略名, %m-消息體, %n-換行

第14行, 格式化ostreamAppender對象的輸出格式

第16-20行, 創建category對象, category主要功能是輸出日志,根據Appender對象的不同,將日志輸出到不同的對象; getInstance(const string &name), name為策略的名字,一般的,我們使用程序名

第22-25行, 以何種優先級輸出日志

第27行, 關閉一系列對象

上述info(), error()等函數,其參數亦可采用printf()函數參數類型,格式化消息體

注意:

  上述簡單的demo,有個地方需要特別注意,在創建layout對象的時候,一定要創建在堆上,原因在第14行, 次layout指針作為引用傳遞到ostreamAppender類的最頂層基類,作為其成員對象,在ostreamAppender對象退出其聲明周期時,其頂層基類會調用析構函數釋放layout指針內存,如果layout是創建在棧上,會導致程序崩潰。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM