嘿,各位C++er们!我是小康 👋
今天我们来聊一个每个开发者都绕不开的话题------日志记录。
你是不是还在用最原始的 cout
和 printf
调试代码?是不是因为线上程序出问题找不到日志而抓狂?别急,今天我就来给大家盘点一下C++界那些大名鼎鼎的日志库,看看哪个最适合你的项目!
为什么需要专业的日志库?
在深入介绍各种日志库之前,先说说为什么我们需要专业的日志库:
专业需求
- 性能要求:生产环境下,日志不能影响主业务性能
- 线程安全:多线程环境下确保日志不会乱序或丢失
- 格式控制:统一的日志格式,便于后续分析
- 文件管理:自动切分、压缩、清理过期日志
- 级别控制:根据环境动态调整日志级别
如果你还在用 cout
打日志,说明你还没体验过专业日志库的魅力!接下来,让我们看看C++界都有哪些"明星选手"。
从 0 到 1 实现高性能日志库 MiniSpdlog --- 这可能是最适合新手的日志系统实战项目
🏆 第一梯队:业界标杆级日志库
1. spdlog - 当之无愧的性能之王
spdlog 是一个快速的、仅头文件的 C++ 日志库,使用 fmt 库进行格式化,支持多种输出方式。
核心特点:
- 超快的性能(详见基准测试)
- 支持同步和异步日志
- 丰富的格式化功能,使用优秀的 fmt 库
- 多线程和单线程日志器
- 文件滚动、每日日志文件
- 控制台日志(支持颜色)
使用示例:
cpp
#include "spdlog/spdlog.h"
int main() {
spdlog::info("欢迎使用 spdlog!");
spdlog::error("出错了: {}", 42);
spdlog::warn("格式化很简单: {:03.2f}", 1.23456);
}
性能表现: 在基准测试中,spdlog 在平均情况下表现出色,但在最坏情况延迟方面需要权衡。
适用场景:
- 高性能应用
- 需要异步日志的系统
- 对格式化要求较高的项目
2. glog - 谷歌出品,必属精品
glog 是 Google 日志模块的 C++ 实现。
核心特点:
- Google 出品,稳定可靠
- 简单易用,依赖少
- 自动crash处理和stack trace
- 支持不同严重级别的日志
- 在独立应用中表现优秀
使用示例:
cpp
#include <glog/logging.h>
int main(int argc, char* argv[]) {
google::InitGoogleLogging(argv[0]);
LOG(INFO) << "这是一条信息日志";
LOG(WARNING) << "警告: " << 42;
LOG(ERROR) << "错误发生了!";
return 0;
}
注意事项: glog 只能初始化一次,如果在库中使用需要考虑配置问题。
适用场景:
- Google 技术栈项目
- 需要稳定性的企业级应用
- 单体应用程序
3. Boost.Log - 功能最强大的重型武器
Boost.Log 设计得非常模块化和可扩展。
核心特点:
- 功能极其丰富
- 高度可定制化
- 支持复杂的过滤和格式化
- 更像是构建自己日志库的框架
使用示例:
cpp
#include <boost/log/trivial.hpp>
int main() {
BOOST_LOG_TRIVIAL(info) << "这是一个测试 " << 123;
return 0;
}
⚠️ 注意事项: 文档量巨大,学习曲线陡峭。
适用场景:
- 复杂的企业级系统
- 需要高度定制化的项目
- 对功能要求极高的场景
🥈 第二梯队:各有特色的专业选手
4. log4cpp - 经典的Java Log4j移植版
Log4cpp 是一个 C++ 类库,用于灵活地记录日志到文件、syslog 和其他目的地,它模仿了 Java 的 Log4j 库。
核心特点:
- 成熟稳定(2024年8月还在更新)
- 支持多种输出目标(文件、syslog、IDSA 等)
- 配置灵活
- 线程安全,支持灵活和任意粒度的日志管理控制
使用示例:
cpp
#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("警告日志");
}
适用场景:
- 传统企业项目
- 需要与Java系统保持一致的日志格式
- 对稳定性要求高的系统
5. plog - 轻量级的简洁选择
plog 是一个可移植且简单的 C++ 日志库,代码少于1000行。
核心特点:
- 代码量极少(<1000行)
- 头文件库,易集成
- 可移植、简单且可扩展
- 轻量级但功能完整
使用示例:
cpp
#include <plog/Log.h>
#include <plog/Initializers/RollingFileInitializer.h>
int main() {
plog::init(plog::debug, "app.log"); // 初始化日志
PLOGD << "这是调试信息";
PLOGI << "程序启动成功";
PLOGW << "这是警告: " << 42;
PLOGE << "发生错误!";
}
适用场景:
- 小型项目
- 需要快速集成的场景
- 对库大小敏感的项目
6. fmtlog - 纳秒级延迟的性能怪兽
fmtlog 是一个高性能的 fmtlib 风格的日志库,延迟达到纳秒级。
核心特点:
- 纳秒级延迟性能
- 使用 fmtlib 风格的API
- 专为高频日志场景优化
使用示例:
cpp
#include "fmtlog/fmtlog.h"
int main() {
fmtlog::setLogFile("app.log");
logd("这是调试信息: {}", 42);
logi("程序启动成功");
logw("警告: 数值 = {:.2f}", 3.14159);
loge("错误发生: {}", "内存不足");
fmtlog::poll(); // 处理异步日志
return 0;
}
适用场景:
- 高频交易系统
- 实时性要求极高的应用
- 对延迟敏感的系统
7. G3log - 异步安全的可靠选择
G3log 是带有动态 Sink 的异步日志器。
核心特点:
- 异步且"崩溃安全"的日志器
- 可以捕获致命事件如段错误
- 动态Sink支持
- 专为稳定性设计
使用示例:
cpp
#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) << "程序启动";
LOG(WARNING) << "这是警告: " << 123;
LOG(FATAL) << "严重错误"; // 会触发程序终止
}
适用场景:
- 对稳定性要求极高的系统
- 需要崩溃保护的应用
- 长期运行的服务程序
🥉 第三梯队:新兴力量和特色选手
8. Quill - 现代化的异步日志库
Quill 是一个异步跨平台低延迟日志库。
核心特点:
- 现代C++设计
- 异步处理
- 跨平台支持
- 低延迟优化
9. reckless - 追求极致吞吐量
reckless 是一个低延迟、高吞吐量的异步日志库。
核心特点:
- 极高的吞吐量
- 专为性能优化
- 异步处理机制
10. loguru - 轻量级的现代选择
loguru 是一个轻量级的 C++ 日志库。
核心特点:
- 只有两个文件:loguru.hpp 和 loguru.cpp
- 小巧简单的库设计
- 头文件没有 #includes,编译速度快
- 无依赖
性能大比拼:谁才是真正的速度之王?
根据各种基准测试和社区反馈,我们来看看性能排行:
超高性能级别
- fmtlog - 纳秒级延迟
- spdlog - 微秒级,平均性能优秀
- NanoLog - 纳秒级性能的日志系统
高性能级别
- G3log - 异步性能稳定
- Quill - 现代异步优化
- reckless - 高吞吐量专家
中等性能级别
- glog - 稳定可靠
- plog - 轻量级性能
- loguru - 简洁实用
功能优先级别
- Boost.Log - 功能丰富,性能适中
- log4cpp - 成熟稳定,性能传统
性能提示 : 在评估日志库时,不仅要看平均性能,还要关注最坏情况延迟,特别是在高负载场景下。
选择指南:哪个最适合你?
追求极致性能
推荐:spdlog + fmtlog
- 适用:高频交易、游戏引擎、实时系统
- 特点:微秒/纳秒级延迟,异步处理
企业级稳定性
推荐:glog + Boost.Log
- 适用:企业应用、长期维护项目
- 特点:成熟稳定,功能全面
轻量级快速开发
推荐:plog + loguru
- 适用:小项目、原型开发、快速迭代
- 特点:集成简单,代码量少
安全关键系统
推荐:G3log
- 适用:系统软件、服务器应用
- 特点:崩溃安全,异步可靠
💡 实战建议:如何选择和使用
评估维度
- 性能需求:QPS要求、延迟容忍度
- 功能需求:格式化、文件滚动、多线程
- 集成成本:学习曲线、依赖关系
- 维护成本:社区活跃度、文档质量
- 项目特点:团队规模、项目周期
最佳实践
- 先评估再选择:根据项目需求进行基准测试
- 统一团队标准:避免项目中使用多种日志库
- 合理设计日志级别:开发/测试/生产环境区别对待
- 关注性能影响:定期监控日志对系统性能的影响
🎉 写在最后:从使用到精通,就差这一步!
看到这里,相信你对C++日志库的选择已经心中有数了。但是,光会选择和使用是不够的!
作为一个有追求的C++开发者,你是否想过:
- 这些日志库的核心设计思想是什么?
- 高性能是如何实现的?
- 如何从零开始设计一个日志库?
- 多线程、异步、性能优化的精髓在哪里?
知其然,更要知其所以然!
如果你想深入理解日志库的设计精髓,想拥有一个能写进简历的硬核项目,想在面试中自信地谈论高性能系统设计,我强烈推荐你看看我最近打磨完成的 MiniSpdlog 高性能日志系统实战项目:从 0 到 1 实现高性能日志库 MiniSpdlog --- 这可能是最适合新手的日志系统实战项目 !
🔥 为什么推荐这个项目?
不是简单的代码教学,而是系统性的工程实践:
- ✅ 2500行精品代码 :不多不少,刚好能完全理解, 加上测试代码 总共 4700 行。
- ✅ 核心功能完整:同步/异步、多 Sink、格式化、滚动文件
- ✅ 性能优秀:单线程百万级吞吐,多线程几十万级
- ✅ 架构清晰:参考 spdlog 设计,业界最佳实践
- ✅ 可直接使用:带完整测试、性能优化、CMake 配置,开箱即用
- ✅ 8天渐进式实现:从基础框架到高性能异步系统
这不是纸上谈兵,而是真刀真枪的实战:
- 面试硬通货:80%的C++后台面试都会问日志相关问题
- 简历加分项:一个完整的、性能优秀的开源项目经验
- 技能全覆盖:一个项目学会10+个核心技术点
- 生产级可用:不是Demo,而是真正能用的高质量代码
最重要的是,你将学会如何做性能分析和优化:
- 使用 perf 工具 进行性能剖析
- 找出性能瓶颈并针对性优化
- 验证优化效果,掌握性能调优精髓
对项目感兴趣的朋友可以看这篇详细介绍 :从 0 到 1 实现高性能日志库 MiniSpdlog --- 这可能是最适合新手的日志系统实战项目 !
如何报名?
添加我的微信:jkfwdkf ,备注「日志库」
或者 扫描下方二维码,立即开始你的日志库实战之旅!
从看懂别人的代码,到自己能设计实现,就差这一步实战经验!
让我们一起,用8天时间,打造一个属于你自己的高性能日志库,为你的C++技能和职业发展加上最亮的一笔!💪
项目部分截图:
....
其他C++硬核项目实战 :
手撸线程池才是C++程序员的硬实力!7天手把手带你从0到1完整实现
三周肝出4000行代码,我的内存池竟然让malloc"破防"了!性能暴涨7.37倍背后的技术真相
手撸4200行MySQL连接池,8天带你搞定后端核心组件!
终于有人把C++多线程下载工具讲透了!7天手把手带你写出专业级工具
这些项目都会深入涉及多线程编程、并发优化、 高并发处理、系统级性能调优等企业级开发的核心技术,而且是在真实的项目环境中应用。不是纸上谈兵,而是真刀真枪地写代码、调优化、解决实际问题。
感兴趣的同学,赶紧加我vx:jkfwdkf ,备注「项目实战」!