純C日志函數庫,zlog 1.1.1 發布
zlog 1.1.1 優化了好幾處
- 提高日志等級不輸出的時候的判斷速度
- 緩存了pid,tid的字符串形式
- 緩存了時間日期的字符串形式,增加了%D默認時間格式
- 加速了微妙、毫秒的輸出速度
并且發現了原來1.0版為了追求速度而造成的一個問題——標準IO庫帶有緩存,而不同的進程寫同一個文件時用的是不同的緩存,而這會導致日志交錯,所以退回到采用write的系統調用來解決原子性問題。所以從表面上來看寫日志的速度下降了(不過依然在我的筆記本上達到25萬條日志每秒),而其他優化對CPU的壓力反而降低了,現在的CPU主要耗費在等待IO上。要徹底解決這個問題很困難,需要山寨部分的標準IO庫的實現……而我需要休息一陣了。
這是最新的 zlog使用手冊:https://github.com/downloads/HardySimpson/zlog/UsersGuide-CN.pdf
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)