Fromwiki: https://code.google.com/p/easynetwork/wiki/libslog
libslog是一個基于linux的高性能開源C/C++多線程安全日志庫。 EasyNetwork 服務端開源架構使用了libslog作為日志庫。
libslog的最新源碼可從這裡下載下傳: libslog.tar
有任何寶貴的意見和建議請聯系作者: [email protected]
一、 特性
a. 多線程安全
b. 簡單的配置參數
c. 支援熱更新log參數,如從INFO級别更改為DEBUG不需要重新開機伺服器
二、安裝與使用
a. 編譯make
b. 安裝sudo make install
c. 使用
libslog使用非常簡單,在自己的源檔案中包含頭檔案slog.h:
使用libslog時需要先進行初始化:#include "slog.h"
其中SLOG_CONFIG_PATH是slog的配置檔案路徑,如果為NULL的話将使用預設的配置參數,并且log将列印到螢幕。SLOG_INIT(SLOG_CONFIG_PATH); //SLOG_INIT(NULL);
libslog有5個log級别:TRACE、DEBUG、INFO、WARN、ERROR。TRACE級别最高,将列印所有級别的log。DEBUG次之,可以列印TRACE除外的其他log。ERROR最低,隻列印本級别的log。slog的使用非常簡單,與C語言的printf格式一緻:其中SLOG_UNINIT()是對slog的反初始化。#include "slog.h" int main() { SLOG_INIT(NULL); SLOG_TRACE("hello slog. %d", 1); SLOG_DEBUG("hello slog. %d", 2); SLOG_INFO("hello slog. %d", 3); SLOG_WARN("hello slog. %d", 4); SLOG_ERROR("hello slog. %d", 5); SLOG_UNINIT(); return; }
最後連結slog庫:三、 性能g++ a.cpp -lslog -o test_slog
a. 測試條件每次寫入100w條資料,測試10次. 每條資料的格式如下: slog: 2012-09-24 17:55:52[WARN]ccccccc... (99個'C'字元) log4cpp: 2012-09-24 18:03:58 [INFO]: [sub1] ccccccc... (99個'C'字元)
b. 機器負載c. log4cpp版本slog: load average: 0.25, 0.32, 0.60 log4cpp: load average: 0.29, 0.37, 0.51
d. 測試結果log4cpp-1.1rc1.tar.gz
性能比log4cpp高5倍:)---------------------------- \ | slog | log4cpp --------------------------- 1 | 1.7867 | 10.4785 2 | 1.8693 | 11.6938 3 | 1.8035 | 9.6103 4 | 1.9039 | 9.6179 5 | 1.7574 | 10.6606 6 | 1.7622 | 9.7011 7 | 1.7441 | 9.5807 8 | 1.8711 | 11.1646 9 | 1.7866 | 9.6206 10 | 1.7732 | 9.6028 ----|----------------------- avg | 1.8058 | 10.17309 ---------------------------- (機關:s)
四、 slog的配置參數
slog的配置參數非常簡單,并且支援熱更新,即在不需要重新開機伺服器的情況下修改配置參數,這點對線上跟蹤問題非常有用。### log級别 slog_level=DEBUG #slog_level=INFO ### log檔案名 slog_log_name=./log/server.log ### log 檔案最大大小(機關M) slog_log_maxsize=20M ### log檔案最多個數 slog_log_maxcount=30 ### log緩沖區大小(機關KB,預設512KB) slog_flush_size=1024 ### log緩沖重新整理間隔(機關s,預設1s) slog_flush_interval=2 ### log動态更新配置參數的時間間隔(機關s,預設60s) config_update_interval=30
五、 測試代碼(見源碼)
a. slog_test.cchar buf[100]; memset(buf, 'c', 100); buf[99]=0; int i,j; struct timeval start, end; printf("start...\n"); gettimeofday(&start, NULL); for(i=0; i<</span>100; ++i) { for(j=0;j<</span>10000; ++j) SLOG_WARN("%s", buf); } gettimeofday(&end, NULL); printf("end...\n"); int us = (end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec); printf("use time:%0.4f(s)\n", us/1000000.0);
b. log4cpp_test.cppchar buf[100]; memset(buf, 'C', 100); buf[99] = '\0'; int i, j; struct timeval start, end; printf("start...\n"); gettimeofday(&start, NULL); for(i=0; i<</span>100; ++i) { for(j=0; j<</span>10000; ++j) sub1.info(buf); } gettimeofday(&end, NULL); printf("end...\n"); int us = (end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec); printf("use time:%0.4f(s)\n", us/1000000.0);