天天看點

libslog---高性能開源C/C++多線程安全日志庫

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:

#include "slog.h"
           
使用libslog時需要先進行初始化:
SLOG_INIT(SLOG_CONFIG_PATH);
//SLOG_INIT(NULL);
           
其中SLOG_CONFIG_PATH是slog的配置檔案路徑,如果為NULL的話将使用預設的配置參數,并且log将列印到螢幕。
libslog有5個log級别:TRACE、DEBUG、INFO、WARN、ERROR。TRACE級别最高,将列印所有級别的log。DEBUG次之,可以列印TRACE除外的其他log。ERROR最低,隻列印本級别的log。slog的使用非常簡單,與C語言的printf格式一緻:
#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_UNINIT()是對slog的反初始化。
最後連結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. 機器負載
slog:  load average: 0.25, 0.32, 0.60
log4cpp:  load average: 0.29, 0.37, 0.51
           
c. log4cpp版本
log4cpp-1.1rc1.tar.gz
           
d. 測試結果
----------------------------
 \  |  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)
           
性能比log4cpp高5倍:)

四、 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.c
char 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.cpp
char 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);