libslog---高性能开源C/C++多线程安全日志库
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:#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.16469 | 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);
libslog---高性能开源C/C++多线程安全日志库相关推荐
- 介绍一个使用 Go 语言开发的高性能可配置可扩展的日志库 logit
这是一个使用 Go 语言开发的高性能可配置可扩展的日志库,名字叫 logit. logit 是一个高性能的日志库,从测试结果来看,比主流日志库 zap.logrus 这些要快不少. logit 支持配 ...
- muduo学习笔记:base部分之高性能日志库
服务端编程,日志必不可少,生产环境中应做到"Log Everything All The Time". 一个日志库答题分为前端(Logging.{h,cc})和后端(LogFile ...
- 深度|从Go高性能日志库zap看如何实现高性能Go组件
导语:zap是uber开源的Go高性能日志库.本文作者深入分析了zap的架构设计和具体实现,揭示了zap高效的原因.并且对如何构建高性能Go语言库给出自己的建议. 作者简介:李子昂,美图公司架构平台系 ...
- Logan:美团点评的开源移动端基础日志库
前言 Logan是美团点评集团移动端基础日志组件,这个名称是Log和An的组合,代表个体日志服务.同时Logan也是"金刚狼"大叔的名号,当然我们更希望这个产品能像金刚狼大叔一样犀 ...
- 深度 | 从Go高性能日志库zap看如何实现高性能Go组件
导语:zap是uber开源的Go高性能日志库.本文作者深入分析了zap的架构设计和具体实现,揭示了zap高效的原因.并且对如何构建高性能Go语言库给出自己的建议. 作者简介:李子昂,美图公司架构平台系 ...
- 一文告诉你如何用好uber开源的zap日志库
1. 引子 日志在后端系统中有着重要的地位,通过日志不仅可以直观看到程序的当前运行状态,更重要的是日志可以在程序发生问题时为开发人员提供线索. 在Go生态中,logrus[2]可能是使用最多的Go日志 ...
- muduo多线程异步日志分析
最近在看muduo的源码,对于其日志系统的实现颇为感兴趣,找了两三天好好研究了一下,本文记录一些所学到的知识. 基础知识 日志是每个高性能服务器必备的组件,分为两种:诊断日志和交易日志.诊断日志,主要 ...
- Druid:一个用于大数据实时处理的开源分布式系统——大数据实时查询和分析的高容错、高性能开源分布式系统...
转自:http://www.36dsj.com/archives/28590 Druid 是一个用于大数据实时查询和分析的高容错.高性能开源分布式系统,旨在快速处理大规模的数据,并能够实现快速查询和分 ...
- C++11实战——多线程的日志类
C++11实战--多线程的日志类 C++标准库的std::cout和std::ofstream重载了operator<<,单线程使用非常简单.但由于其并非线程安全,在多线程中使用则需要自己 ...
最新文章
- Java数据类型及变量作业_day02、Java变量与数据类型
- Some notes for CLFS2017
- 聊一聊CSS中的死循环
- Java使用OpenCV3.2实现视频读取与播放
- XAML实例教程系列 - 标记扩展(Markup Extensions)
- ML_集成学习与Boosting模型
- plsql 破解|oracle plsql 破解
- 【自考】-计算机网络原理
- 新手入门 | 算法书籍推荐
- 金蝶系统提示服务器不是有效的,金蝶服务器不是有效的,请重新设置问题
- HM5469A单节锂电池保护IC过流9A电流可以做8W
- 老路用得上的商学课-61-80学习(读书)笔记
- 时域反射仪(TDR)介绍
- linux 下安装openoffice服务 百度文库在线预览 doc转pdf、pdf转swf格式
- [附源码]Nodejs计算机毕业设计我的大学电子相册Express(程序+LW)
- Mysql索引、命令重点介绍
- 第九周.02.KAT
- 计算机电路计数器pl什么意思,计数器的原理为什么1下来是2.而且频率是一样的.它是怎么进位的.它的电路原理是什么...
- mysql索引与md5_谈Mysql索引
- hihihi,我又回来啦!今天分享的是2021:【例4.6】最大公约数 代码如下
热门文章
- SQLServer数据库自增长标识列的更新修改操作
- 使用Apache Archiva搭建Maven Repository Server
- oracle /+append/好用吗,ORACLE-insert /*+append*/提高性能
- python使用xlrd读取xlsx文件_005:【Python读取本地Excel文件】使用xlrd模块来读取本地Excel文件...
- mysql 单例模式好处_PHP单例模式的优点分析
- 在Putty或mRemote下输入和显示中文
- 《AlwaysRun团队》第三次作业:团队项目的原型设计
- java中等待所有线程都执行结束
- 基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自己主动适应宽带高度...
- Kafka Log Compaction 解析