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

用 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++ 项目真正需要的其实是一个更直接的入口:

cpp 复制代码
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 测试入口

终端效果大概是这样:

快速运行

bash 复制代码
git clone https://github.com/SoleyRan/Log.git
cd Log
cmake -S . -B build
cmake --build build
./build/demo/log_demo

默认 demo 会把日志文件写到:

bash 复制代码
/tmp/goodlog/

日志格式

GoodLog 默认输出包含时间、级别、源码位置和消息:

text 复制代码
[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

日志文件会按序号和时间命名,便于排序和排查:

text 复制代码
00000-2026-05-02-10-24-18.log
00001-2026-05-02-10-27-42.log

日志级别怎么配置?

console_log_levelfile_log_level 分别控制终端输出和文件输出的最低日志级别。

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

比如:

cpp 复制代码
goodlog::logInit("/tmp/goodlog/", 2, 1, 10, 10);

表示:

  • 终端输出 info 及以上级别
  • 文件保存 debug 及以上级别
  • 单个日志文件最大 10 MB
  • 最多保留 10 个日志文件

这样可以让终端保持相对干净,同时在文件里保留更多调试信息。

Hex Dump

GoodLog 也提供了二进制数据的 Hex Dump 辅助宏,适合调试网络包、传感器数据、通信协议或中间件消息。

cpp 复制代码
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是一个不错的选择。但如果您需要的是完全无依赖、跨平台包管理器发布、或者企业级完整日志框架,那它可能不太适合您。

项目结构

text 复制代码
.
|-- 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,我将第一时间回复。

相关推荐
触底反弹15 小时前
拷个 .exe 到新电脑就跑不起来?你缺的不是文件,是对链接的理解
c++·windows·操作系统
是个西兰花16 小时前
linux:命名管道与共享内存
linux·运维·服务器·网络·c++
凡人叶枫16 小时前
Effective C++ 条款08:别让异常逃离析构函数
java·linux·数据库·c++·嵌入式开发
QiLinkOS17 小时前
QiLink开源生态的三维重构:基于时间、空间与社会价值的底层规则创新白皮书
大数据·c++·人工智能·科技·算法·gitee·开源
牛肉在哪里17 小时前
ros2 从零开始28 监听广播C++
开发语言·c++·算法·机器人
玖玥拾17 小时前
C/C++ 数据结构(二)双向链表
c语言·数据结构·c++
枕星而眠17 小时前
Linux守护进程完全指南:从原理到实战
linux·运维·服务器·c++·后端
QiLinkOS17 小时前
极客精神与商业思维的融合实践(2)
c语言·c++·人工智能·算法·开源协议
charlie11451419117 小时前
现代C++特性指南——constexpr 构造函数与字面类型
开发语言·c++
极客BIM工作室18 小时前
OCCT gp_Trsf 三维变换类深度剖析:经典设计与底层陷阱
c++