libslog---高性能开源C/C++多线程安全日志库

来源:互联网 发布:切割音频的软件 编辑:程序博客网 时间:2024/05/17 09:08
Fromwiki: https://code.google.com/p/easynetwork/wiki/libslog
libslog是一个基于linux的高性能开源C/C++多线程安全日志库。EasyNetwork 服务端开源框架使用了libslog作为日志库。
libslog的最新源码可从这里下载:libslog.tar
有任何宝贵的意见和建议请联系作者:xmulyj@gmail.com

一、 特性

a. 多线程安全
b. 简单的配置参数
c. 支持热更新log参数,如从INFO级别更改为DEBUG不需要重启服务器

二、安装与使用

a. 编译 
make
b. 安装
sudo make install
c. 使用
libslog使用非常简单,在自己的源文件中包含头文件slog.h:
[cpp] view plain copy
  1. #include "slog.h"  
使用libslog时需要先进行初始化:
[cpp] view plain copy
  1. SLOG_INIT(SLOG_CONFIG_PATH);  
  2. //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格式一致:
[cpp] view plain copy
  1. #include "slog.h"  
  2.   
  3.   
  4. int main()  
  5. {  
  6.   
  7.   SLOG_INIT(NULL);  
  8.   
  9.   SLOG_TRACE("hello slog. %d", 1);  
  10.   
  11.   SLOG_DEBUG("hello slog. %d", 2);  
  12.   
  13.   SLOG_INFO("hello slog. %d", 3);  
  14.   
  15.   SLOG_WARN("hello slog. %d", 4);  
  16.   
  17.   SLOG_ERROR("hello slog. %d", 5);  
  18.   
  19.   SLOG_UNINIT();  
  20.   
  21.   return;  
  22. }  
其中SLOG_UNINIT()是对slog的反初始化。
最后链接slog库:
[cpp] view plain copy
  1. g++ a.cpp -lslog -o test_slog  
三、 性能
a. 测试条件

[plain] view plain copy
  1. 每次写入100w条数据,测试10次. 每条数据的格式如下:  
  2. slog:  2012-09-24 17:55:52[WARN]ccccccc...  (99个'C'字符)  
  3. log4cpp:  2012-09-24 18:03:58 [INFO]: [sub1] ccccccc...  (99个'C'字符)  

b. 机器负载
[plain] view plain copy
  1. slog:  load average: 0.25, 0.32, 0.60  
  2. log4cpp:  load average: 0.29, 0.37, 0.51  
c. log4cpp版本
[plain] view plain copy
  1. log4cpp-1.1rc1.tar.gz  

d. 测试结果
[plain] view plain copy
  1. ----------------------------  
  2.  \  |  slog     |  log4cpp    
  3. ---------------------------  
  4.  1  | 1.7867    |  10.4785    
  5.  2  | 1.8693    |  11.6938   
  6.  3  | 1.8035    |  9.6103    
  7.  4  | 1.9039    |  9.6179     
  8.  5  | 1.7574    |  10.6606   
  9.  6  | 1.7622    |  9.7011     
  10.  7  | 1.7441    |  9.5807   
  11.  8  | 1.8711    |  11.1646  
  12.  9  | 1.7866    |  9.6206  
  13. 10  | 1.7732    |  9.6028  
  14. ----|-----------------------  
  15. avg |  1.8058   | 10.17309  
  16. ----------------------------  
  17.                    (单位:s)  

性能比log4cpp高5倍:)

四、 slog的配置参数

slog的配置参数非常简单,并且支持热更新,即在不需要重启服务器的情况下修改配置参数,这点对线上跟踪问题非常有用。
[plain] view plain copy
  1. ### log级别  
  2.   
  3. slog_level=DEBUG  
  4. #slog_level=INFO  
  5. ### log文件名  
  6.   
  7. slog_log_name=./log/server.log  
  8. ### log 文件最大大小(单位M)  
  9.   
  10. slog_log_maxsize=20M  
  11. ### log文件最多个数  
  12.   
  13. slog_log_maxcount=30  
  14. ### log缓冲区大小(单位KB,默认512KB)  
  15.   
  16. slog_flush_size=1024  
  17. ### log缓冲刷新间隔(单位s,默认1s)  
  18.   
  19. slog_flush_interval=2  
  20. ### log动态更新配置参数的时间间隔(单位s,默认60s)  
  21.   
  22. config_update_interval=30  

五、 测试代码(见源码)

a. slog_test.c
[cpp] view plain copy
  1. char buf[100];  
  2.   
  3. memset(buf, 'c', 100);  
  4.   
  5. buf[99]=0;  
  6.   
  7.   
  8. int i,j;  
  9. struct timeval start, end;  
  10.   
  11. printf("start...\n");  
  12. gettimeofday(&start, NULL);  
  13. for(i=0; i<</span>100; ++i)  
  14. {  
  15.   
  16.         for(j=0;j<</span>10000; ++j)  
  17.   
  18.                 SLOG_WARN("%s", buf);  
  19. }  
  20.   
  21. gettimeofday(&end, NULL);  
  22.   
  23. printf("end...\n");  
  24.   
  25. int us = (end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);  
  26. printf("use time:%0.4f(s)\n", us/1000000.0);  

b. log4cpp_test.cpp
[cpp] view plain copy
  1. char buf[100];  
  2.   
  3. memset(buf, 'C', 100);  
  4.   
  5. buf[99] = '\0';  
  6.   
  7. int i, j;  
  8. struct timeval start, end;  
  9.   
  10. printf("start...\n");  
  11. gettimeofday(&start, NULL);  
  12. for(i=0; i<</span>100; ++i)  
  13. {  
  14.   
  15.         for(j=0; j<</span>10000; ++j)  
  16.   
  17.                 sub1.info(buf);  
  18. }  
  19.   
  20. gettimeofday(&end, NULL);  
  21.   
  22. printf("end...\n");  
  23.   
  24. int us = (end.tv_sec-start.tv_sec)*1000000+(end.tv_usec-start.tv_usec);  
  25. printf("use time:%0.4f(s)\n", us/1000000.0);  
原创粉丝点击