用 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,我将第一时间回复。

相关推荐
蒸蒸yyyyzwd5 分钟前
cpp 选手备战秋招学习笔记 day23
c++·求职招聘
.YM.Z9 分钟前
C++ STL 容器深度剖析:vector 与 list 的模拟实现及对比
开发语言·c++·vector·list
mengzhi啊2 小时前
QEventLoop loop配合loop.exec();替代while(1)。电脑cpu占用为0,使用while(1)cpu占用率100%
c++·qt
HugoStudio_SWAN2 小时前
洛谷 P1319 / P1320 压缩技术——同一枚硬币的正反面
c++·学习·程序人生·算法
小小晓.2 小时前
C++单例模式万字详解:6种实现演进+线程安全彻底解决+CRTP终极模板
c++·单例模式
j7~3 小时前
【C++11】C++11 新特性全套详解(列表初始化、右值引用、lambda 表达式、function 与 bind 包装器等)
c++·右值引用·lambda表达式·可变参数模板·移动语义·包装器·c++11发展史
无小道4 小时前
C/C++——可变参数
c语言·开发语言·c++·可变参数
hele_two4 小时前
C++模拟蚁群(二)
c++·算法·数学建模·图形渲染
WK100%4 小时前
LeetCode双题:滑动窗口破解最小子数组
c++·经验分享·笔记·算法
@福者4 小时前
C++ QT 入门
开发语言·c++·qt