纯 C 日志函数库,zlog 1.2.5 发布

jopen 12年前

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)

这是一个错误修复、性能提高、降低内存使用的版本,解决了下列问题:

  1. 保证在单个线程退出的时候自动删除缓存(而不是等到zlog_fini才释放), 用atexit来注册函数解决主线程退出的问题。这样,即使大规模的创建销毁线程,zlog依然可以把缓存大小控制住,和存活的线程数量成线性比例。
  2. 缓存所有的时间字符串,保证所有的%d在strftime的时候都能每秒缓存,达到和原先%D一样的速度,这样无论在配置中用了多少%d的时间串,都能保证最多每秒调用一次strftime,也就保证了性能。
  3. 鉴于上面那点,去掉%D的使用,虽然库还支持,但文档和实例代码都用%d。
  4. 修复makefile静态链接zlog-chk-conf。
  5. 其他一些github上提出的对象销毁的问题。

必须感叹一下,写一个线程安全、正确无误函数库实在很困难。

不过最终能达到自己满意的结果,一切辛苦都是值得的!