C++日志庫(kù)"神仙打架"!spdlog、glog、Boost.Log 誰(shuí)才是真王者?
嘿,各位C++er們!我是小康??
今天我們來(lái)聊一個(gè)每個(gè)開發(fā)者都繞不開的話題——日志記錄。
你是不是還在用最原始的 cout 和 printf 調(diào)試代碼?是不是因?yàn)榫€上程序出問題找不到日志而抓狂?別急,今天我就來(lái)給大家盤點(diǎn)一下C++界那些大名鼎鼎的日志庫(kù),看看哪個(gè)最適合你的項(xiàng)目!

為什么需要專業(yè)的日志庫(kù)?
在深入介紹各種日志庫(kù)之前,先說(shuō)說(shuō)為什么我們需要專業(yè)的日志庫(kù):
專業(yè)需求:
- 性能要求:生產(chǎn)環(huán)境下,日志不能影響主業(yè)務(wù)性能
- 線程安全:多線程環(huán)境下確保日志不會(huì)亂序或丟失
- 格式控制:統(tǒng)一的日志格式,便于后續(xù)分析
- 文件管理:自動(dòng)切分、壓縮、清理過(guò)期日志
- 級(jí)別控制:根據(jù)環(huán)境動(dòng)態(tài)調(diào)整日志級(jí)別
如果你還在用 cout 打日志,說(shuō)明你還沒體驗(yàn)過(guò)專業(yè)日志庫(kù)的魅力!接下來(lái),讓我們看看C++界都有哪些"明星選手"。
?? 第一梯隊(duì):業(yè)界標(biāo)桿級(jí)日志庫(kù)
(1) spdlog - 當(dāng)之無(wú)愧的性能之王
spdlog 是一個(gè)快速的、僅頭文件的 C++ 日志庫(kù),使用 fmt 庫(kù)進(jìn)行格式化,支持多種輸出方式。
核心特點(diǎn):
- 超快的性能(詳見基準(zhǔn)測(cè)試)
- 支持同步和異步日志
- 豐富的格式化功能,使用優(yōu)秀的 fmt 庫(kù)
- 多線程和單線程日志器
- 文件滾動(dòng)、每日日志文件
- 控制臺(tái)日志(支持顏色)
使用示例:
#include "spdlog/spdlog.h"
int main() {
spdlog::info("歡迎使用 spdlog!");
spdlog::error("出錯(cuò)了: {}", 42);
spdlog::warn("格式化很簡(jiǎn)單: {:03.2f}", 1.23456);
}性能表現(xiàn): 在基準(zhǔn)測(cè)試中,spdlog 在平均情況下表現(xiàn)出色,但在最壞情況延遲方面需要權(quán)衡。
適用場(chǎng)景:
- 高性能應(yīng)用
- 需要異步日志的系統(tǒng)
- 對(duì)格式化要求較高的項(xiàng)目
(2) glog - 谷歌出品,必屬精品
glog 是 Google 日志模塊的 C++ 實(shí)現(xiàn)。
核心特點(diǎn):
- Google 出品,穩(wěn)定可靠
- 簡(jiǎn)單易用,依賴少
- 自動(dòng)crash處理和stack trace
- 支持不同嚴(yán)重級(jí)別的日志
- 在獨(dú)立應(yīng)用中表現(xiàn)優(yōu)秀
使用示例:
#include <glog/logging.h>
int main(int argc, char* argv[]) {
google::InitGoogleLogging(argv[0]);
LOG(INFO) << "這是一條信息日志";
LOG(WARNING) << "警告: " << 42;
LOG(ERROR) << "錯(cuò)誤發(fā)生了!";
return 0;
}注意事項(xiàng): glog 只能初始化一次,如果在庫(kù)中使用需要考慮配置問題。
適用場(chǎng)景:
- Google 技術(shù)棧項(xiàng)目
- 需要穩(wěn)定性的企業(yè)級(jí)應(yīng)用
- 單體應(yīng)用程序
(3) Boost.Log - 功能最強(qiáng)大的重型武器
Boost.Log 設(shè)計(jì)得非常模塊化和可擴(kuò)展。
核心特點(diǎn):
- 功能極其豐富
- 高度可定制化
- 支持復(fù)雜的過(guò)濾和格式化
- 更像是構(gòu)建自己日志庫(kù)的框架
使用示例:
#include <boost/log/trivial.hpp>
int main() {
BOOST_LOG_TRIVIAL(info) << "這是一個(gè)測(cè)試 " << 123;
return 0;
}?? 注意事項(xiàng): 文檔量巨大,學(xué)習(xí)曲線陡峭。
適用場(chǎng)景:
- 復(fù)雜的企業(yè)級(jí)系統(tǒng)
- 需要高度定制化的項(xiàng)目
- 對(duì)功能要求極高的場(chǎng)景
?? 第二梯隊(duì):各有特色的專業(yè)選手
(4) log4cpp - 經(jīng)典的Java Log4j移植版
Log4cpp 是一個(gè) C++ 類庫(kù),用于靈活地記錄日志到文件、syslog 和其他目的地,它模仿了 Java 的 Log4j 庫(kù)。
核心特點(diǎn):
- 成熟穩(wěn)定(2024年8月還在更新)
- 支持多種輸出目標(biāo)(文件、syslog、IDSA 等)
- 配置靈活
- 線程安全,支持靈活和任意粒度的日志管理控制
使用示例:
#include "log4cpp/Category.hh"
#include "log4cpp/Appender.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/Layout.hh"
#include "log4cpp/BasicLayout.hh"
int main() {
log4cpp::Category& root = log4cpp::Category::getRoot();
root.setPriority(log4cpp::Priority::WARN);
log4cpp::Category& sub1 = log4cpp::Category::getInstance("sub1");
sub1.info("這是一條信息日志");
sub1.warn("警告日志");
}適用場(chǎng)景:
- 傳統(tǒng)企業(yè)項(xiàng)目
- 需要與Java系統(tǒng)保持一致的日志格式
- 對(duì)穩(wěn)定性要求高的系統(tǒng)
(5) plog - 輕量級(jí)的簡(jiǎn)潔選擇
plog 是一個(gè)可移植且簡(jiǎn)單的 C++ 日志庫(kù),代碼少于1000行。
核心特點(diǎn):
- 代碼量極少(<1000行)
- 頭文件庫(kù),易集成
- 可移植、簡(jiǎn)單且可擴(kuò)展
- 輕量級(jí)但功能完整
使用示例:
#include <plog/Log.h>
#include <plog/Initializers/RollingFileInitializer.h>
int main() {
plog::init(plog::debug, "app.log"); // 初始化日志
PLOGD << "這是調(diào)試信息";
PLOGI << "程序啟動(dòng)成功";
PLOGW << "這是警告: " << 42;
PLOGE << "發(fā)生錯(cuò)誤!";
}適用場(chǎng)景:
- 小型項(xiàng)目
- 需要快速集成的場(chǎng)景
- 對(duì)庫(kù)大小敏感的項(xiàng)目
(6) fmtlog - 納秒級(jí)延遲的性能怪獸
fmtlog 是一個(gè)高性能的 fmtlib 風(fēng)格的日志庫(kù),延遲達(dá)到納秒級(jí)。
核心特點(diǎn):
- 納秒級(jí)延遲性能
- 使用 fmtlib 風(fēng)格的API
- 專為高頻日志場(chǎng)景優(yōu)化
使用示例:
#include "fmtlog/fmtlog.h"
int main() {
fmtlog::setLogFile("app.log");
logd("這是調(diào)試信息: {}", 42);
logi("程序啟動(dòng)成功");
logw("警告: 數(shù)值 = {:.2f}", 3.14159);
loge("錯(cuò)誤發(fā)生: {}", "內(nèi)存不足");
fmtlog::poll(); // 處理異步日志
return 0;
}適用場(chǎng)景:
- 高頻交易系統(tǒng)
- 實(shí)時(shí)性要求極高的應(yīng)用
- 對(duì)延遲敏感的系統(tǒng)
(7) G3log - 異步安全的可靠選擇
G3log 是帶有動(dòng)態(tài) Sink 的異步日志器。
核心特點(diǎn):
- 異步且"崩潰安全"的日志器
- 可以捕獲致命事件如段錯(cuò)誤
- 動(dòng)態(tài)Sink支持
- 專為穩(wěn)定性設(shè)計(jì)
使用示例:
#include <g3log/g3log.hpp>
#include <g3log/logworker.hpp>
int main() {
auto worker = g3::LogWorker::createLogWorker();
auto handle= worker->addDefaultLogger("app", "./");
g3::initializeLogging(worker.get());
LOG(INFO) << "程序啟動(dòng)";
LOG(WARNING) << "這是警告: " << 123;
LOG(FATAL) << "嚴(yán)重錯(cuò)誤"; // 會(huì)觸發(fā)程序終止
}適用場(chǎng)景:
- 對(duì)穩(wěn)定性要求極高的系統(tǒng)
- 需要崩潰保護(hù)的應(yīng)用
- 長(zhǎng)期運(yùn)行的服務(wù)程序
?? 第三梯隊(duì):新興力量和特色選手
(8) Quill - 現(xiàn)代化的異步日志庫(kù)
Quill 是一個(gè)異步跨平臺(tái)低延遲日志庫(kù)。
核心特點(diǎn):
- 現(xiàn)代C++設(shè)計(jì)
- 異步處理
- 跨平臺(tái)支持
- 低延遲優(yōu)化
(9) reckless - 追求極致吞吐量
reckless 是一個(gè)低延遲、高吞吐量的異步日志庫(kù)。
核心特點(diǎn):
- 極高的吞吐量
- 專為性能優(yōu)化
- 異步處理機(jī)制
(10) loguru - 輕量級(jí)的現(xiàn)代選擇
loguru 是一個(gè)輕量級(jí)的 C++ 日志庫(kù)。
核心特點(diǎn):
- 只有兩個(gè)文件:loguru.hpp 和 loguru.cpp
- 小巧簡(jiǎn)單的庫(kù)設(shè)計(jì)
- 頭文件沒有 #includes,編譯速度快
- 無(wú)依賴
性能大比拼:誰(shuí)才是真正的速度之王?
根據(jù)各種基準(zhǔn)測(cè)試和社區(qū)反饋,我們來(lái)看看性能排行:
超高性能級(jí)別:
- fmtlog - 納秒級(jí)延遲
- spdlog - 微秒級(jí),平均性能優(yōu)秀
- NanoLog - 納秒級(jí)性能的日志系統(tǒng)
高性能級(jí)別:
- G3log - 異步性能穩(wěn)定
- Quill - 現(xiàn)代異步優(yōu)化
- reckless - 高吞吐量專家
中等性能級(jí)別:
- glog - 穩(wěn)定可靠
- plog - 輕量級(jí)性能
- loguru - 簡(jiǎn)潔實(shí)用
功能優(yōu)先級(jí)別:
- Boost.Log - 功能豐富,性能適中
- log4cpp - 成熟穩(wěn)定,性能傳統(tǒng)
性能提示 : 在評(píng)估日志庫(kù)時(shí),不僅要看平均性能,還要關(guān)注最壞情況延遲,特別是在高負(fù)載場(chǎng)景下。
選擇指南:哪個(gè)最適合你?
(1) 追求極致性能
推薦:spdlog + fmtlog
- 適用:高頻交易、游戲引擎、實(shí)時(shí)系統(tǒng)
- 特點(diǎn):微秒/納秒級(jí)延遲,異步處理
(2) 企業(yè)級(jí)穩(wěn)定性
推薦:glog + Boost.Log
- 適用:企業(yè)應(yīng)用、長(zhǎng)期維護(hù)項(xiàng)目
- 特點(diǎn):成熟穩(wěn)定,功能全面
(3) 輕量級(jí)快速開發(fā)
推薦:plog + loguru
- 適用:小項(xiàng)目、原型開發(fā)、快速迭代
- 特點(diǎn):集成簡(jiǎn)單,代碼量少
(4) 安全關(guān)鍵系統(tǒng)
推薦:G3log
- 適用:系統(tǒng)軟件、服務(wù)器應(yīng)用
- 特點(diǎn):崩潰安全,異步可靠
?? 實(shí)戰(zhàn)建議:如何選擇和使用
評(píng)估維度:
- 性能需求:QPS要求、延遲容忍度
- 功能需求:格式化、文件滾動(dòng)、多線程
- 集成成本:學(xué)習(xí)曲線、依賴關(guān)系
- 維護(hù)成本:社區(qū)活躍度、文檔質(zhì)量
- 項(xiàng)目特點(diǎn):團(tuán)隊(duì)規(guī)模、項(xiàng)目周期
最佳實(shí)踐:
- 先評(píng)估再選擇:根據(jù)項(xiàng)目需求進(jìn)行基準(zhǔn)測(cè)試
- 統(tǒng)一團(tuán)隊(duì)標(biāo)準(zhǔn):避免項(xiàng)目中使用多種日志庫(kù)
- 合理設(shè)計(jì)日志級(jí)別:開發(fā)/測(cè)試/生產(chǎn)環(huán)境區(qū)別對(duì)待
- 關(guān)注性能影響:定期監(jiān)控日志對(duì)系統(tǒng)性能的影響

























