日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

日志单例log4cpp简述

發布時間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 日志单例log4cpp简述 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1、log4test.cpp
  • 自動對齊 ?gg=G
  • ?編譯使用log4cpp庫的CPP文件時,要加上庫文件,如下示例 ? ?g++ log4test.cpp -llog4cpp -lpthread
  • log4cpp學習

log4app使用單例模式。
  • Appender可以定位日志輸出信息 ,如console,或保存到文件中
  • Category可以有不同的輸出種類,Root是根輸出,可以創建子輸出,分別對應到不同的輸出位置。
  • Layout是輸出格式,其子類PatternLayout可以自定義
  • PatternLayout使用setConversionPattern函數來設置日志的輸出格式
%c category; %d 日期;日期可以進一步的設置格式,用花括號包圍,例如%d{%H:%M:%S,%l} 或者 %d{%d %m %Y %H:%M:%S,%l}。如果不設置具體日期格式,則如下默認格式被使用“Wed Jan 02 02:03:55 1980”。日期的格式符號與ANSI C函數strftime中的一致。但增加了一個格式符號%l,表示毫秒,占三個十進制位。 %m 消息; %n 換行符,會根據平臺的不同而不同,但對于用戶透明; %p 優先級; %r 自從layout被創建后的毫秒數; %R 從1970年1月1日0時開始到目前為止的秒數; %u 進程開始到目前為止的時鐘周期數; %x NDC。
  • NDC是nested DiagnosticContext的縮寫,意思是“嵌套的診斷上下文”。
  • NDC是一種用來區分不同源代碼中交替出現的日志的手段。當一個服務端程序同時記錄好幾個并行客戶時,輸出的日志會混雜在一起難以區分。但如果不同上下文的日志入口擁有一個特定的標識,則可以解決這個問題。NDC就是在這種情況下發揮作用。
  • 注意NDC是以線程為基礎的,每個線程擁有一個NDC,每個NDC的操作僅對執行該操作的線程有效。

?log4cpp之Appender ? ?----> 定位輸出:
常用appender有:
  • log4cpp::FileAppender // 輸出到文件
  • log4cpp::RollingFileAppender // 輸出到回卷文件,即當文件到達某個大小后回卷
  • log4cpp::OstreamAppender // 輸出到一個ostream類
  • log4cpp::StringQueueAppender // 內存隊列
依次講解:
  • OstreamAppender
  • 創建一個OstreamAppender的具體方法如下:
log4cpp::OstreamAppender* osAppender = new log4cpp::OstreamAppender("osAppender", &cout); ? 第一個參數指定OstreamAppender的名稱,第二個參數指定它關聯的流的指針。
  • StringQueueAppender
StringQueueAppender用于記錄多線程程序或者實時程序的日志比較方便,--->后面再學習。 StringQueueAppender的功能是將日志記錄到一個字符串隊列中,該字符串隊列使用了STL中的兩個容器,即字符串容器std::string和隊列容器std::queue,具體如下: std::queue<std::string> _queue;
  • 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列表。

系統中默認的優先級等級如下: ? typedefenum { ? ?? ?????EMERG = 0, ? ?? ?????FATAL = 0, ? ?? ?????ALERT = 100, ? ?? ?????CRIT = 200, ? ?? ?????ERROR = 300, ? ?? ?????WARN = 400, ? ?? ?????NOTICE =500, ? ?? ?????INFO = 600, ? ?? ?????DEBUG = 700, ? ?? ?????NOTSET =800 }PriorityLevel;   注意:取值越小,優先級越高。
手動使用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简述的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。