日志单例log4cpp简述
生活随笔
收集整理的這篇文章主要介紹了
日志单例log4cpp简述
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、log4test.cpp
log4app使用單例模式。
?log4cpp之Appender ? ?----> 定位輸出:
常用appender有:
FileAppender和RollingFileAppender是log4cpp中最常用的兩個Appender,其功能是將日志寫入文件中。它們之間唯一的區別就是前者會一直在文件中記錄日志(直到操作系統承受不了為止),而后者會在文件長度到達指定值時循環記錄日志,文件長度不會超過指定值(默認的指定值是10M byte)。
FileAppender的創建函數如下:
FileAppender(const std::string& name, const std::string& fileName, ? bool append = true, mode_t mode = 00644);
一般僅使用前兩個參數,即“名稱”和“日志文件名”。第三個參數指示是否在日志文件后繼續記入日志,還是清空原日志文件再記錄。第四個參數說明文件的打開方式。
RollingFileAppender的創建函數如下:
RollingFileAppender(const std::string& name, ? const std::string& fileName, ? size_t maxFileSize = 10*1024*1024, ? unsigned int maxBackupIndex = 1, ? bool append = true, ? mode_t mode = 00644);
兩個參數:maxFileSize指出了回滾文件的最大值;maxBackupIndex指出了回滾文件所用的備份文件的最大個數
?log4cpp之Category
Log4cpp有一個實例化好的Category,即根Category。使用log4cpp::Category::getRoot()可以得到根Category。在大多數情況下,一個應用程序只需要一個日志種類(Category),但是有時也會用到多個Category,此時可以使用根Category的getInstance方法來得到子Category。不同的子Category用于不同的場合。
優先級說明:
默認notset優先級最低。注意下面這些相當于都是實例Category的一些信息輸出成員函數方法,可以通過.?操作符訪問? eg: Category?category_one.info("ni hao!");
NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG
手動使用log4cpp的基本步驟如下:
deom one: //構造函數Mylog::Mylog(): category_ref_(log4cpp::Category::getRoot()) {//自定義輸出格式log4cpp::PatternLayout *pattern_one = new log4cpp::PatternLayout; pattern_one->setConversionPattern("%d: %p %c %x:%m%n");log4cpp::PatternLayout *pattern_two = new log4cpp::PatternLayout; pattern_two->setConversionPattern("%d: %p %c %x:%m%n");//獲取屏幕輸出log4cpp::OstreamAppender *os_appender = new log4cpp::OstreamAppender("osAppender",&std::cout);os_appender->setLayout(pattern_one); //獲取文件日志輸出 ( 日志文件名:mylog.txt )log4cpp::FileAppender *file_appender = new log4cpp::FileAppender("fileAppender","mylog.txt");file_appender->setLayout(pattern_two); category_ref_.setPriority(log4cpp::Priority::DEBUG);category_ref_.addAppender(os_appender); category_ref_.addAppender(file_appender); category_ref_.info("Mylog created!"); }deom two: #include #include #include #include #include #include #include #include using std::cout; using std::endl; using std::ostringstream; using std::string; using namespace log4cpp; int main(void) { PatternLayout * ptnLyout1 = new PatternLayout(); ptnLyout1->setConversionPattern("%d: [%p] :%m%n"); PatternLayout * ptnLyout2 = new PatternLayout(); ptnLyout2->setConversionPattern("%d: [%p] :%m%n"); FileAppender * fileAppender = new FileAppender("fileAppender", "wd.log"); fileAppender->setLayout(ptnLyout1); RollingFileAppender * rollingFileAppender = new RollingFileAppender("rollingFileAppender", "rollwd.log", 5 * 1024, 2); rollingFileAppender->setLayout(ptnLyout2); Category & root = Category::getRoot().getInstance("root"); root.addAppender(fileAppender); root.addAppender(rollingFileAppender); root.setPriority(Priority::DEBUG); for(size_t idx = 0; idx != 200; ++idx) { string errormsg; ostringstream oss; oss << idx << ":Root Error Message"; root.error(oss.str()); } Category::shutdown(); return 0; }
- 自動對齊 ?gg=G
- ?編譯使用log4cpp庫的CPP文件時,要加上庫文件,如下示例 ? ?g++ log4test.cpp -llog4cpp -lpthread
- log4cpp學習
log4app使用單例模式。
- Appender可以定位日志輸出信息 ,如console,或保存到文件中
- Category可以有不同的輸出種類,Root是根輸出,可以創建子輸出,分別對應到不同的輸出位置。
- Layout是輸出格式,其子類PatternLayout可以自定義
- PatternLayout使用setConversionPattern函數來設置日志的輸出格式
- NDC是nested DiagnosticContext的縮寫,意思是“嵌套的診斷上下文”。
- NDC是一種用來區分不同源代碼中交替出現的日志的手段。當一個服務端程序同時記錄好幾個并行客戶時,輸出的日志會混雜在一起難以區分。但如果不同上下文的日志入口擁有一個特定的標識,則可以解決這個問題。NDC就是在這種情況下發揮作用。
- 注意NDC是以線程為基礎的,每個線程擁有一個NDC,每個NDC的操作僅對執行該操作的線程有效。
?log4cpp之Appender ? ?----> 定位輸出:
常用appender有:
- log4cpp::FileAppender // 輸出到文件
- log4cpp::RollingFileAppender // 輸出到回卷文件,即當文件到達某個大小后回卷
- log4cpp::OstreamAppender // 輸出到一個ostream類
- log4cpp::StringQueueAppender // 內存隊列
- OstreamAppender
- 創建一個OstreamAppender的具體方法如下:
- StringQueueAppender
- FileAppender和RollingFileAppender
FileAppender和RollingFileAppender是log4cpp中最常用的兩個Appender,其功能是將日志寫入文件中。它們之間唯一的區別就是前者會一直在文件中記錄日志(直到操作系統承受不了為止),而后者會在文件長度到達指定值時循環記錄日志,文件長度不會超過指定值(默認的指定值是10M byte)。
FileAppender的創建函數如下:
FileAppender(const std::string& name, const std::string& fileName, ? bool append = true, mode_t mode = 00644);
一般僅使用前兩個參數,即“名稱”和“日志文件名”。第三個參數指示是否在日志文件后繼續記入日志,還是清空原日志文件再記錄。第四個參數說明文件的打開方式。
RollingFileAppender的創建函數如下:
RollingFileAppender(const std::string& name, ? const std::string& fileName, ? size_t maxFileSize = 10*1024*1024, ? unsigned int maxBackupIndex = 1, ? bool append = true, ? mode_t mode = 00644);
兩個參數:maxFileSize指出了回滾文件的最大值;maxBackupIndex指出了回滾文件所用的備份文件的最大個數
?log4cpp之Category
Log4cpp有一個實例化好的Category,即根Category。使用log4cpp::Category::getRoot()可以得到根Category。在大多數情況下,一個應用程序只需要一個日志種類(Category),但是有時也會用到多個Category,此時可以使用根Category的getInstance方法來得到子Category。不同的子Category用于不同的場合。
優先級說明:
- category 類真正完成記錄日志功能,兩個主要組成部分是appenders和priority(優先級)。
- 優先級控制哪類日志信息可以被這個category記錄,當前優先級分為:NOTSET, DEBUG, INFO, NOTICE, WARN, ERROR, CRIT, ALERT 或 FATAL/EMERG 。
- 每個日志信息有個優先級,每個category有個優先級,當消息的優先級大于等于category的優先級時,這個消息才會被category記錄,否則被忽略。
- 優先級的關系如下。category類和appender的關系是,多個appender附在category上,這樣一個日志消息可以同時輸出到多個設備上。
默認notset優先級最低。注意下面這些相當于都是實例Category的一些信息輸出成員函數方法,可以通過.?操作符訪問? eg: Category?category_one.info("ni hao!");
NOTSET < DEBUG < INFO < NOTICE < WARN < ERROR < CRIT < ALERT < FATAL = EMERG
- category被組織成一個樹,子category創建時優先級缺省NOTSET,category缺省會繼承父category的appender。
- 而如果不希望這種appender的繼承關系,log4cpp允許使用additivity 標簽,為false時新的appender取代category的appender列表。
手動使用log4cpp的基本步驟如下:
- 實例化一個layout 對象;
- 初始化一個appender 對象;
- 把layout對象附著在appender對象上;
- 調用log4cpp::Category::getInstance("name"). 實例化一個category對象;
- 把appender對象附到category上(根據additivity的值取代其他appender或者附加在其他appender后)。
- 設置category的優先級;
deom one: //構造函數Mylog::Mylog(): category_ref_(log4cpp::Category::getRoot()) {//自定義輸出格式log4cpp::PatternLayout *pattern_one = new log4cpp::PatternLayout; pattern_one->setConversionPattern("%d: %p %c %x:%m%n");log4cpp::PatternLayout *pattern_two = new log4cpp::PatternLayout; pattern_two->setConversionPattern("%d: %p %c %x:%m%n");//獲取屏幕輸出log4cpp::OstreamAppender *os_appender = new log4cpp::OstreamAppender("osAppender",&std::cout);os_appender->setLayout(pattern_one); //獲取文件日志輸出 ( 日志文件名:mylog.txt )log4cpp::FileAppender *file_appender = new log4cpp::FileAppender("fileAppender","mylog.txt");file_appender->setLayout(pattern_two); category_ref_.setPriority(log4cpp::Priority::DEBUG);category_ref_.addAppender(os_appender); category_ref_.addAppender(file_appender); category_ref_.info("Mylog created!"); }deom two: #include #include #include #include #include #include #include #include using std::cout; using std::endl; using std::ostringstream; using std::string; using namespace log4cpp; int main(void) { PatternLayout * ptnLyout1 = new PatternLayout(); ptnLyout1->setConversionPattern("%d: [%p] :%m%n"); PatternLayout * ptnLyout2 = new PatternLayout(); ptnLyout2->setConversionPattern("%d: [%p] :%m%n"); FileAppender * fileAppender = new FileAppender("fileAppender", "wd.log"); fileAppender->setLayout(ptnLyout1); RollingFileAppender * rollingFileAppender = new RollingFileAppender("rollingFileAppender", "rollwd.log", 5 * 1024, 2); rollingFileAppender->setLayout(ptnLyout2); Category & root = Category::getRoot().getInstance("root"); root.addAppender(fileAppender); root.addAppender(rollingFileAppender); root.setPriority(Priority::DEBUG); for(size_t idx = 0; idx != 200; ++idx) { string errormsg; ostringstream oss; oss << idx << ":Root Error Message"; root.error(oss.str()); } Category::shutdown(); return 0; }
- 服務器程序,會一直運行,需要對程序的運行狀態進行記錄,日志系統。
- Category自己有一個優先級,每條日志也有一個優先級,只有日志優先級高于或相等Category的優先級時,日志才會被記錄。
- 每個Category可以對應多個Appender。
- 一個Appender對應一個Layout
- 設計:
-
- 1 G的空間來存儲日志
- 16個日志文件,每個日志文件大小是 64 M, 當快要接近閾值時,回卷文件可能將最早的時間給覆蓋掉,寫新的日志。
總結
以上是生活随笔為你收集整理的日志单例log4cpp简述的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用matalb、python画聚类结果图
- 下一篇: Java并发编程,Condition的a