纯C日志函数库,zlog 1.1.1 发布
jopen 12年前
<p><a href="/misc/goto?guid=4958336037474582756" target="_blank">zlog 1.1.1 </a>优化了好几处</p> <ol> <li>提高日志等级不输出的时候的判断速度</li> <li>缓存了pid,tid的字符串形式</li> <li>缓存了时间日期的字符串形式,增加了%D默认时间格式</li> <li>加速了微妙、毫秒的输出速度</li> </ol> <p> </p> <p>并且发现了原来1.0版为了追求速度而造成的一个问题——标准IO库带有缓存,而不同的进程写同一个文件时用的是不同的缓存,而这会导致日志交错,所以退回到采用write的系统调用来解决原子性问题。所以从表面上来看写日志的速度下降了(不过依然在我的笔记本上达到25万条日志每秒),而其他优化对CPU的压力反而降低了,现在的CPU主要耗费在等待IO上。要彻底解决这个问题很困难,需要山寨部分的标准IO库的实现……而我需要休息一阵了。</p> <p>这是最新的 zlog使用手册:https://github.com/downloads/HardySimpson/zlog/UsersGuide-CN.pdf<br /> </p> <p style="font-weight:bold;">zlog是一个高性能、线程安全、灵活、概念清晰的纯C日志函数库。</p> <p>事实上,在C的世界里面没有特别好的日志函数库(就像JAVA里面的的log4j,或者C++的log4cxx)。C程序员都喜欢用自己的轮子。 printf就是个挺好的轮子,但没办法通过配置改变日志的格式或者输出文件。syslog是个系统级别的轮子,不过速度慢,而且功能比较单调。 log4c异常坑爹(有内存泄漏、效率低等等),而且已经停止开发</p> <p>所以我(难易)写了zlog。 </p> <p>zlog有这些特性:</p> <p> </p> <p> * syslog分类模型,基于规则路由过滤,比log4j模型要正确高效,详见<a title="为什么log4j的概念模型是错误的" href="/misc/goto?guid=4958347349039484102" target="_blank">为什么log4j的概念模型是错误的</a>。</p> <p> * 日志格式定制,类似于log4j的pattern layout</p> <p> * 多种输出,包括动态文件、静态文件、stdout、stderr、syslog、用户自定义输出函数</p> <p> * 运行时手动或自动刷新配置(同时保证安全)</p> <p> * 高性能,在我的笔记本上达到338'638条日志每秒, 大概是syslog(3)配合rsyslogd的1000倍速度 </p> <p> * 高可靠性和速度之间的平衡,用户自定义多少条日志后fsync数据到硬盘</p> <p> * 用户自定义等级</p> <p> * 多线程和多进程环境下保证安全转档</p> <p> * 精确到微秒</p> <p> * 简单调用包装dzlog(一个程序默认只用一个分类)</p> <p> * MDC,线程键-值对的表,可以扩展用户自定义的字段</p> <p> * 自诊断,可以在运行时输出zlog自己的日志和配置状态</p> <p> * 不依赖其他库,只要是个POSIX系统就成(当然还要一个C99兼容的vsnprintf)</p> <p></p>