用 Boost.Log 封装一个更顺手的 C++17 日志库:GoodLog
最近我整理了一个小型 C++ 日志组件:GoodLog。
它不是想重新造一个完整日志框架,而是基于 Boost.Log 做一层更轻量的封装,让项目里常见的日志需求更容易落地:彩色终端输出、文件轮转、日志级别过滤、源码位置记录,以及二进制数据的 Hex Dump。目前,我将它作为我们智驾团队车端日志记录的标准库。
GitHub 地址:
为什么做这个项目?
Boost.Log 本身功能很强,但在实际项目里,每次配置 console sink、file sink、formatter、rotation、collector、severity filter 都比较繁琐。
很多 C++ 项目真正需要的其实是一个更直接的入口:
goodlog::logInit("/tmp/goodlog/", 2, 1, 10, 10);
LOG_Debug() << "debug details";
LOG_Info() << "service started";
LOG_Warn() << "using fallback config";
LOG_Error() << "connection failed";
我希望把这些重复配置收起来,保留 Boost.Log 的能力,同时给业务代码一个更干净的使用方式。
GoodLog 支持什么?
目前 GoodLog 支持:
- C++17
- 基于 Boost.Log
- trace / debug / info / warning / error / fatal 六个级别
- 自动记录
file:line - 终端彩色输出
- 文件日志轮转
- 控制台和文件分别设置日志级别
- 可选 channel 过滤
- 二进制 buffer 的 Hex Dump
- CMake 构建
- demo 和 GoogleTest 测试入口
终端效果大概是这样:
快速运行
git clone https://github.com/SoleyRan/Log.git
cd Log
cmake -S . -B build
cmake --build build
./build/demo/log_demo
默认 demo 会把日志文件写到:
/tmp/goodlog/
日志格式
GoodLog 默认输出包含时间、级别、源码位置和消息:
[2026-05-02 10:24:18.123456]<info>[main.cpp:18]:service started
[2026-05-02 10:24:18.123789]<warning>[main.cpp:19]:using fallback config
[2026-05-02 10:24:18.124000]<error>[main.cpp:20]:connection failed
日志文件会按序号和时间命名,便于排序和排查:
00000-2026-05-02-10-24-18.log
00001-2026-05-02-10-27-42.log
日志级别怎么配置?
console_log_level 和 file_log_level 分别控制终端输出和文件输出的最低日志级别。
| 数值 | 级别 |
|---|---|
0 | trace |
1 | debug |
2 | info |
3 | warning |
4 | error |
5 | fatal |
比如:
goodlog::logInit("/tmp/goodlog/", 2, 1, 10, 10);
表示:
- 终端输出
info及以上级别 - 文件保存
debug及以上级别 - 单个日志文件最大
10 MB - 最多保留
10个日志文件
这样可以让终端保持相对干净,同时在文件里保留更多调试信息。
Hex Dump
GoodLog 也提供了二进制数据的 Hex Dump 辅助宏,适合调试网络包、传感器数据、通信协议或中间件消息。
std::array<unsigned char, 4> payload = {0x12, 0x34, 0xab, 0xcd};
LOG_DEBUG_HEX(payload.data(), payload.size(), "rx payload");
这类功能在调试底层通信、自动驾驶中间件、机器人系统时挺常用。
为什么保留 Boost.Log 作为后端?
我没有选择从零实现日志系统,主要是因为 Boost.Log 已经解决了很多底层问题,比如 sink、formatter、severity、异步写入、文件 backend 等。
GoodLog 更像是一层工程化封装:把常用配置固化下来,让项目接入更快,让业务代码里的日志调用更短、更一致。
适合什么场景?
GoodLog 比较适合这些场景:
- C++ 服务程序
- 中间件模块
- 机器人或自动驾驶相关工具
- 需要频繁调试二进制协议或传感器数据的程序
- 已经在项目里使用 Boost 的工程
如果您需要的是一个快速接入可以使用的日志框架,那么GoodLog是一个不错的选择。但如果您需要的是完全无依赖、跨平台包管理器发布、或者企业级完整日志框架,那它可能不太适合您。
项目结构
.
|-- CMakeLists.txt
|-- demo/
| `-- log_demo.cpp
|-- src/
| |-- log.hpp
| |-- text_file_backend_self_defined.cpp
| `-- text_file_backend_self_defined.hpp
`-- test/
`-- log_test.cpp
后续计划
接下来我准备继续补:
- 更好的 CMake install/export 支持
- Ubuntu CI
- 更完整的集成示例
- channel macro 命名空间清理
- 更多测试用例
项目地址
如果你也在 C++ 项目里用过 Boost.Log,或者对日志库接口设计有建议,欢迎随时交流,或者提 issue,我将第一时间回复。