C日志函数库-zlog
zlog是一个高性能、线程安全、灵活、概念清晰的纯C日志函数库。zlog is a high efficent, thread safe, flexsible, clear model, pure c logging library.
Actually, in the c world there is NO good logging library for application like logback in java or log4cxx in c++. printf can work, but can not be easily redirected or reformat, syslog is slow and is designed for system use.
作者编写的初衷是因为log4c不给力,而log4j、log4cxx等log4系列的日志函数库在概念上不正确。zlog继承了unix操作系统中syslog的伟大传统,将日志系统的分类、级别、输出方向、输出格式完全解耦。
事实上,在C的世界里面没有特别好的日志函数库(就像JAVA里面的的log4j,或者C++的log4cxx)。C程序员都喜欢用自己的轮子。printf就是个挺好的轮子,但没办法通过配置改变日志的格式或者输出文件。syslog是个系统级别的轮子,不过速度慢,而且功能比较单调。log4c异常坑爹(有内存泄漏、效率低等等),而且已经停止开发。
特性:
• syslog风格的配置文件,易学易用
• 纲目分类模型,比log4j系列的继承模型更加清晰
• 多种输出,包括动态文件、静态文件、stdout、stderr、syslog
• 可以在运行时动态刷新配置,只需要调用函数zlog_update()
• 高性能,在我的笔记本上达到72'000条日志每秒, 大概是syslog(3)配合rsyslogd的200倍速度
• 用户可以自定义等级,无需改变库代码
• 多线程和多进程写同一个日志的情况下,安全转档(转档就是把太大的日志重命名)
• 可以精确到微秒
• MDC,一个log4j风格的键-值对的表,可以扩展用户自定义的字段
• 自诊断,可以在运行时输出zlog自己的日志和配置状态
• 不依赖其他库,只要是个POSIX系统就成
最新版本:1.2
保证在单个线程退出的时候自动删除缓存(而不是等到zlog_fini才释放), 用atexit来注册函数解决主线程退出的问题。这样,即使大规模的创建销毁线程,zlog依然可以把缓存大小控制住,和存活的线程数量成线性比例。
缓存所有的时间字符串,保证所有的%d在strftime的时候都能每秒缓存,达到和原先%D一样的速度,这样无论在配置中用了多少%d的时间串,都能保证最多每秒调用一次strftime,也就保证了性能。 鉴于上面那点,去掉%D的使用,虽然库还支持,但文档和实例代码都用%d。
其他一些github上提出的对象销毁的问题。
项目主页:https://github.com/HardySimpson/zlog