原文:http://blog.csdn.net/gatieme/article/details/50603682?locationNum=2&fps=1
事實上,在C的世界里面沒有特別好的日志函數庫(就像Java里面的的log4j,或者C++的log4cxx)。C程序員都喜歡用自己的輪子。printf就是個挺好的輪子,但沒辦法通過配置改變日志的格式或者輸出文件。syslog是個系統級別的輪子,不過速度慢,而且功能比較單調。
嘗試了幾種C/C++ log庫,簡單記錄如下:
1 log4j的衍生品
日志是應用軟件中不可缺少的部分,Apache的開源項目Log4j是一個功能強大的日志組件,提供方便的日志記錄,他有很多移植版(包括官方的和非官方的版本)
1.1 log4cxx
地址 http://logging.apache.org/log4cxx/
Log4cxx是開放源代碼項目Apache Logging Service的子項目之一,是Java社區著名的log4j的c++移植版,用於為C++程序提供日志功能,以便開發者對目標程序進行調試和審計。
1.2Log4cpp
log4cpp是個基於LGPL的開源項目,移植自Java的日志處理跟蹤項目log4j,並保持了API上的一致。其類似的支持庫還包括Java(log4j),C++(log4cpp、log4cplus),C(log4c),Python(log4p)等。
而log4c ,
1.3log4c
log4c現已不再有人維護了。不是面向對象的,不支持流式log輸入。有配置文件。最新版本(log4c-1.2.4.tar.gz)存在內存泄露。不建議使用。
1.4 log4cplus
地址 http://sourceforge.net/projects/log4cplus/
log4cplus是C++編寫的開源的日志系統,前身是java編寫的log4j系統.受Apache Software License保護。
作者是Tad E. Smith。log4cplus具有線程安全、靈活、以及多粒度控制的特點,通過將信息划分優先級使其可以面向程序調試、運行、測試、和維護等全生命周期; 你可以選擇將信息輸出到屏幕、文件、
NT event log、甚至是遠程服務器;通過指定策略對日志進行定期備份等等。
2 google glog
Google glog是一個基於程序級記錄日志信息的c++庫,編程使用方式與c++的stream操作類似,例:
LOG(INFO) << “Found ” << num_cookies << ” cookies”;
LOG”宏為日志輸出關鍵字,“INFO”為嚴重性程度。
主要支持功能:
1, 參數設置,以命令行參數的方式設置標志參數來控制日志記錄行為;
2, 嚴重性分級,根據日志嚴重性分級記錄日志;
3, 可有條件地記錄日志信息;
4, 條件中止程序。豐富的條件判定宏,可預設程序終止條件;
5, 異常信號處理。程序異常情況,可自定義異常處理過程;
6, 支持debug功能。可只用於debug模式;
7, 自定義日志信息;
8, 線程安全日志記錄方式;
9, 系統級日志記錄;
10, google perror風格日志信息;
11, 精簡日志字符串信息。
3 z-log
地址 https://github.com/HardySimpson/zlog
z-log是一個高性能、線程安全、靈活、概念清晰的純C日志函數庫。
由難易編寫
zlog有這些特性:
-
syslog分類模型,基於規則路由過濾,比log4j模型要正確高效,詳見為什么log4j的概念模型是錯誤的。
-
日志格式定制,類似於log4j的pattern layout
-
多種輸出,包括動態文件、靜態文件、stdout、stderr、syslog、用戶自定義輸出函數
-
運行時手動或自動刷新配置(同時保證安全)
-
高性能,在我的筆記本上達到338’638條日志每秒, 大概是syslog(3)配合rsyslogd的1000倍速度
-
高可靠性和速度之間的平衡,用戶自定義多少條日志后fsync數據到硬盤
-
用戶自定義等級
-
多線程和多進程環境下保證安全轉檔
-
精確到微秒
-
簡單調用包裝dzlog(一個程序默認只用一個分類)
-
MDC,線程鍵-值對的表,可以擴展用戶自定義的字段
-
自診斷,可以在運行時輸出zlog自己的日志和配置狀態
-
不依賴其他庫,只要是個POSIX系統就成(當然還要一個C99兼容的vsnprintf)
網友提供的其他版本,方便其他平台安裝
auto tools版本: https://github.com/bmanojlovic/zlog
cmake版本:https://github.com/lisongmin/zlog
windows版本: https://github.com/lopsd07/WinZlog
4 spdlog
spdlog 是一個快速的 C++ 日志庫,只包含頭文件,兼容 C++11。
特性:
- 非常快
- 只包含頭文件
- 無需依賴第三方庫
- 支持跨平台 - Linux / Windows on 32/64 bits
- 支持多線程
- 可對日志文件進行循環輸出
- 可每日生成日志文件
- 支持控制台日志輸出
- 可選的異步日志
- 支持日志輸出級別
- 可自定義日志格式
5 c-log
c-log是一個穩定,高效,多線程安全,易用,簡單的C/C++ 日志庫,在github主頁上有豐富的測試case,后續將會推遲直接輸出到scribe等集中式日志收集中間件上,幫助用戶更好的收集,分析日志
6 syslog-ng
syslog-ng作為syslog的替代工具,可以完全替代syslog的服務,並且通過定義規則,實現更好的過濾功能
的一個設計原則就是建立更好的消息過濾粒度。syslog-ng能夠進行基於內容和優先權/facility的過濾。另一個設計原則是更容易進行不同防火牆網段的信息轉發,它支持主機鏈,即使日志消息經過了許多計算機的轉發,也可以找出原發主機地址和整個轉發鏈。最后的一個設計原則就是盡量使配置文件強大和簡潔。
7 輕量級日志EasyLogger
地址 :https://github.com/armink/EasyLogger
7.1 介紹
EasyLogger 是一款超輕量級(ROM<1.6K, RAM<0.3K)、高性能的 C/C++ 日志庫,非常適合對資源敏感的軟件項目,例如: IoT 產品、可穿戴設備、智能家居等等。相比 log4c、zlog 這些知名的 C/C++ 日志庫, EasyLogger 的功能更加簡單,提供給用戶的接口更少,但上手會很快,更多實用功能支持以插件形式進行動態擴展。
7.2 主要特性
支持用戶自定義輸出方式(例如:終端、文件、數據庫、串口、485、Flash…);
日志內容可包含級別、時間戳、線程信息、進程信息等;
日志輸出被設計為線程安全的方式,並支持 異步輸出 及 緩沖輸出 模式;
支持多種操作系統(RT-Thread、UCOS、Linux、Windows…),也支持裸機平台;
日志支持 RAW格式 ;
支持按 標簽 、 級別 、 關鍵詞 進行動態過濾;
各級別日志支持不同顏色顯示
擴展性強,支持以插件形式擴展新功能。
名詞解釋: 1、RAW格式:未經過格式化的原始日志。 2、標簽:在軟件中可以按照文件、模塊、功能等方面,對需要打印的日志設定標簽,實現日志分類。
- 頂