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

相关推荐
汉克老师1 天前
GESP6级C++考试语法知识(十七、数据结构(三、认识队列 Queue))
数据结构·c++·队列·gesp6级·gesp六级·数组模拟队列
j_xxx404_1 天前
Linux进程信号捕捉与操作系统运行本质深度解析
linux·运维·服务器·开发语言·c++·人工智能·ai
vx-程序开发1 天前
基于机器学习的动漫可视化系统的设计与实现-计算机毕业设计源码08339
java·c++·spring boot·python·spring·django·php
啊董dong1 天前
noi-2026年5月12号小测验
数据结构·c++·算法
咩咦1 天前
C++学习笔记24:构造函数初始化列表
c++·学习笔记·类和对象·构造函数·初始化列表·const引用
计算机安禾1 天前
【c++面向对象编程】第43篇:可变参数模板(C++11):优雅处理不定长参数
java·开发语言·c++
10岁的博客1 天前
C++ 进制转换:通用 a 进制转 b 进制(2-36进制)题解
开发语言·c++
小贾要学习1 天前
【Linux】基于自定义TCP协议的日期计算器
linux·网络·c++·网络协议·tcp/ip
YsyaaabB1 天前
ACM 模式通用代码模板
java·c++·python·算法
我命由我123451 天前
C++ - 面向对象 - 析构函数
android·c语言·开发语言·c++·visualstudio·visual studio·android runtime