純 C 日志函數庫,zlog 1.2.5 發布

jopen 12年前發布 | 10K 次閱讀 zlog

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上提出的對象銷毀的問題。

必須感嘆一下,寫一個線程安全、正確無誤函數庫實在很困難。

不過最終能達到自己滿意的結果,一切辛苦都是值得的!

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!