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 { 10log4cpp::OstreamAppender app("osAppender", &cout); 11 12log4cpp::PatternLayout *layout = new log4cpp::PatternLayout(); 13layout->setConversionPattern("%d: %p %c : %m%n"); 14app.setLayout(layout); 15 16log4cpp::Category &root = log4cpp::Category::getRoot(); 17log4cpp::Category &infoCategory = root.getInstance(string(argv[0])); 18 19infoCategory.addAppender(app); 20infoCategory.setPriority(log4cpp::Priority::INFO); 21 22infoCategory.info("system is running..."); 23infoCategory.warn("system has got a warn..."); 24infoCategory.error("system has got an error..."); 25infoCategory.fatal("system has crashed...."); 26 27log4cpp::Category::shutdown(); 28return 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是建立在棧上,會導致程式崩潰。