yaolog v1.6 跨平臺日誌庫 (C++)

       

        寫代碼總免不了要看日誌。就C++而言,不少程序員只是簡單地用printf來輸出日誌,或者臨時寫個日誌類,log4cpp等比較“重型”的日誌庫的使用率反而並不怎麼高(至少從我經歷的項目而言)。也許是不想爲不需要的功能付出額外的學習成本,但無論如何,對於通用類別的工具採取臨時手寫的方式來應付,從長遠考慮,在功能性和健壯性方面是得不償失的。寫這個日誌類(yaolog)的最初的想法只是爲了實現“輸出到文件的帶有時間信息的printf”,後來歷經不同項目需求的“拷問”,借鑑和引用了很多開源代碼(在此對那些作者表示感謝),就成了現在這個樣子。yaolog的主要特點如下:

        # printf風格的接口,包括LOGA__, LOGW__, LOG__, LOGBIN__, LOGBIN_F__
        # 日誌附加信息包括時間,源代碼文件,函數,行號
        # 每個日誌對象都有單獨的行爲
        # 在程序運行時通過配置ini文件動態改變日誌行爲
        # 可以輸出到控制檯窗口,文件,http服務器
        # 線程安全
        # 跨平臺(windows, linux)

        

v1.6新加功能:
1 可以輸出格式化的二進制日誌(見上圖),非常方便對socket通信之類進行debug
2 可以設置每天自動生成新的日誌文件


        這裏有一個重點就是儘可能的簡單,我對接口修改過多次,爲了儘量做到簡單易用和自解釋。而上述功能都是從實際項目的需求中提煉出來的,比如爲什麼每個日誌對象需要有單獨的行爲?看日誌文件最大的煩惱就是內容太多太雜不容易找到需要的,那麼yaolog給出一種解決方法是設置不同的日誌對象,如果想專門查看socket日誌,可以只啓用socket日誌對象,或者將socket日誌專門輸出到一個文件,而這些都是可以在程序運行時動態配置的。又比如發送日誌到http服務器,起因於某次有個用戶在QQ上報了一個bug,這個bug如果在有日誌的debug版本下應該能很快確定原因,但是release版本是沒有日誌的。當然,也可以給用戶一個帶日誌的dll去替換,但是這種方法至少存在兩個問題:版本控制(新的dll和用戶原來的dll一致嗎)和日誌查看(用戶怎樣將日誌提交給開發人員,不要高估了小白)。於是就想到要在服務器端控制日誌的啓用,以及將日誌內容發送到服務器進行分析。

         yaolog v1.6的代碼和demo在這裏

        另外我在codeproject上發了一篇詳細說明,地址在這裏

        如果你覺得這個工具好用請回帖支持一下。有什麼問題或建議可以留言討論。


        下面貼一段簡單的測試代碼:

[cpp] view plain copy
  1. #include <iostream>  
  2. #include "yaolog.h"  
  3.   
  4.   
  5. // 日誌對象的ID,可以自定義,不能雷同  
  6. #define LOGID_I "info"  
  7. #define LOGID_B "bin"  
  8. #define LOGID_FB "formatted_bin"  
  9.   
  10.   
  11. int main()  
  12. {  
  13.     // 初始化,在程序入口點調用  
  14.     YAOLOG_INIT;  
  15.   
  16.     // 創建日誌對象  
  17.     YAOLOG_CREATE(LOGID_I, true, YaoUtil::LOG_TYPE_TEXT);  
  18.     YAOLOG_CREATE(LOGID_B, true, YaoUtil::LOG_TYPE_BIN);  
  19.     YAOLOG_CREATE(LOGID_FB, true, YaoUtil::LOG_TYPE_FORMATTED_BIN);  
  20.   
  21.     LOGA__(LOGID_I, "My name is %s! I'm %d!""neil", 29);  
  22.   
  23.     // 設置日誌對象的屬性:輸出日誌到控制檯窗口和文件  
  24.     YAOLOG_SET_LOG_ATTR(LOGID_I, true, YaoUtil::LOGOUT_FLAG_STDOUT | YaoUtil::LOGOUT_FLAG_FILE, truefalsetruetrue, NULL);  
  25.     LOGW__(LOGID_I, L"My name is %s! I'm %d!", L"neil", 29);  
  26.   
  27.     // 設置日誌對象的屬性:輸出日誌到文件和http服務器  
  28.     YAOLOG_SET_LOG_ATTR(LOGID_I, true, YaoUtil::OUT_FLAG_FILE | YaoUtil::OUT_FLAG_REMOTE, truetruetruetrue"http://192.168.1.195/default.aspx");   
  29.     YAOLOG_SET_LOGFILE_ATTR(LOGID_I, falsefalsefalse"c:\\logfile""tt.log");   
  30.     LOG__(LOGID_I, _T("My name is %s! I'm %d!"), _T("neil"), 29);  
  31.   
  32.     // 設置日誌對象的屬性:使用ini文件  
  33.     YAOLOG_SET_ATTR_FROM_CONFIG_FILE(LOGID_I, "logconfig.ini");  
  34.     for (int i = 0; i < 100; i++)  
  35.     {  
  36.         LOGA__(LOGID_I, "You can modify the ini file and view effect(%d)!", i);  
  37.         Sleep(500);  
  38.     }  
  39.   
  40.     // 二進制日誌   
  41.     YAOLOG_CREATE(LOGID_B, true, YaoUtil::LOG_TYPE_BIN);  
  42.     YAOLOG_SET_ATTR_FROM_CONFIG_FILE(LOGID_B, "logconfig.ini");  
  43.     char buf[10] = { 0,1,2,3,4,5,6,7,8,9 };  
  44.     LOGBIN__(LOGID_B, buf, 10);  
  45.   
  46.     // 格式化的二進制日誌  
  47.     YAOLOG_CREATE(LOGID_FB, true, YaoUtil::LOG_TYPE_FORMATTED_BIN);  
  48.     YAOLOG_SET_ATTR_FROM_CONFIG_FILE(LOGID_FB, "logconfig.ini");   
  49.     char data1[4] = { 0,1,2,3 };  
  50.     char data2[4] = { 4,5,6,7 };  
  51.     LOGBIN_F__(LOGID_FB, "send", data1, 4);  
  52.     LOGBIN_F__(LOGID_FB, "recv", data2, 4);  
  53.   
  54.     std::cin.get();  
  55.   
  56.     // 清理,在程序退出前調用  
  57.     YAOLOG_EXIT;  
  58.     return 0;  
  59. }  

0
發佈了56 篇原創文章 · 獲贊 95 · 訪問量 51萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章