纯 C 日志函数库,zlog 1.2.5 发布
zlog是一个高性能、线程安全、灵活、概念清晰的纯C日志函数库。
事实上,在C的世界里面没有特别好的日志函数库(就像JAVA里面的的log4j,或者C++的log4cxx)。C程序员都喜欢用自己的轮子。 printf就是个挺好的轮子,但没办法通过配置改变日志的格式或者输出文件。syslog是个系统级别的轮子,不过速度慢,而且功能比较单调。 log4c异常坑爹(有内存泄漏、效率低等等),而且已经停止开发
所以我(难易)写了zlog。
zlog有这些特性:
* syslog分类模型,基于规则路由过滤,比log4j模型要正确高效,详见为什么log4j的概念模型是错误的。
* 日志格式定制,类似于log4j的pattern layout
* 多种输出,包括动态文件、静态文件、stdout、stderr、syslog、用户自定义输出函数
* 运行时手动或自动刷新配置(同时保证安全)
* 高性能,在我的笔记本上达到338'638条日志每秒, 大概是syslog(3)配合rsyslogd的1000倍速度
* 高可靠性和速度之间的平衡,用户自定义多少条日志后fsync数据到硬盘
* 用户自定义等级
* 多线程和多进程环境下保证安全转档
* 精确到微秒
* 简单调用包装dzlog(一个程序默认只用一个分类)
* MDC,线程键-值对的表,可以扩展用户自定义的字段
* 自诊断,可以在运行时输出zlog自己的日志和配置状态
* 不依赖其他库,只要是个POSIX系统就成(当然还要一个C99兼容的vsnprintf)
这是一个错误修复、性能提高、降低内存使用的版本,解决了下列问题:
- 保证在单个线程退出的时候自动删除缓存(而不是等到zlog_fini才释放), 用atexit来注册函数解决主线程退出的问题。这样,即使大规模的创建销毁线程,zlog依然可以把缓存大小控制住,和存活的线程数量成线性比例。
- 缓存所有的时间字符串,保证所有的%d在strftime的时候都能每秒缓存,达到和原先%D一样的速度,这样无论在配置中用了多少%d的时间串,都能保证最多每秒调用一次strftime,也就保证了性能。
- 鉴于上面那点,去掉%D的使用,虽然库还支持,但文档和实例代码都用%d。
- 修复makefile静态链接zlog-chk-conf。
- 其他一些github上提出的对象销毁的问题。
必须感叹一下,写一个线程安全、正确无误函数库实在很困难。
不过最终能达到自己满意的结果,一切辛苦都是值得的!