用 Boost.Log 封装一个更顺手的 C++17 日志库:GoodLog

0 阅读3分钟

用 Boost.Log 封装一个更顺手的 C++17 日志库:GoodLog

最近我整理了一个小型 C++ 日志组件:GoodLog。

它不是想重新造一个完整日志框架,而是基于 Boost.Log 做一层更轻量的封装,让项目里常见的日志需求更容易落地:彩色终端输出、文件轮转、日志级别过滤、源码位置记录,以及二进制数据的 Hex Dump。目前,我将它作为我们智驾团队车端日志记录的标准库。

GitHub 地址:

github.com/SoleyRan/Lo…

为什么做这个项目?

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 测试入口

终端效果大概是这样:

_tmp_dingtalkgov_qt_pic_1777710997982.jpg

快速运行

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_levelfile_log_level 分别控制终端输出和文件输出的最低日志级别。

数值级别
0trace
1debug
2info
3warning
4error
5fatal

比如:

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 命名空间清理
  • 更多测试用例

项目地址

github.com/SoleyRan/Lo…

如果你也在 C++ 项目里用过 Boost.Log,或者对日志库接口设计有建议,欢迎随时交流,或者提 issue,我将第一时间回复。