从 0 到 1 实现高性能日志库 MiniSpdlog — 这可能是最适合新手的日志系统实战项目 !

news/2025/10/14 20:56:42/文章来源:https://www.cnblogs.com/xiaokang-coding/p/19142003

嘿,各位C++er们!我是小康 👋

今天我们来聊一个每个开发者都绕不开的话题——日志记录

你是不是还在用最原始的 coutprintf 调试代码?是不是因为线上程序出问题找不到日志而抓狂?别急,今天我就来给大家盘点一下C++界那些大名鼎鼎的日志库,看看哪个最适合你的项目!

为什么需要专业的日志库?

在深入介绍各种日志库之前,先说说为什么我们需要专业的日志库:

专业需求

  • 性能要求:生产环境下,日志不能影响主业务性能
  • 线程安全:多线程环境下确保日志不会乱序或丢失
  • 格式控制:统一的日志格式,便于后续分析
  • 文件管理:自动切分、压缩、清理过期日志
  • 级别控制:根据环境动态调整日志级别

如果你还在用 cout 打日志,说明你还没体验过专业日志库的魅力!接下来,让我们看看C++界都有哪些"明星选手"。


🏆 第一梯队:业界标杆级日志库

1. spdlog - 当之无愧的性能之王

spdlog 是一个快速的、仅头文件的 C++ 日志库,使用 fmt 库进行格式化,支持多种输出方式。

核心特点:

  • 超快的性能(详见基准测试)
  • 支持同步和异步日志
  • 丰富的格式化功能,使用优秀的 fmt 库
  • 多线程和单线程日志器
  • 文件滚动、每日日志文件
  • 控制台日志(支持颜色)

使用示例:

#include "spdlog/spdlog.h"int main() {spdlog::info("欢迎使用 spdlog!");spdlog::error("出错了: {}", 42);spdlog::warn("格式化很简单: {:03.2f}", 1.23456);
}

性能表现: 在基准测试中,spdlog 在平均情况下表现出色,但在最坏情况延迟方面需要权衡。

适用场景:

  • 高性能应用
  • 需要异步日志的系统
  • 对格式化要求较高的项目

2. glog - 谷歌出品,必属精品

glog 是 Google 日志模块的 C++ 实现。

核心特点:

  • Google 出品,稳定可靠
  • 简单易用,依赖少
  • 自动crash处理和stack trace
  • 支持不同严重级别的日志
  • 在独立应用中表现优秀

使用示例:

#include <glog/logging.h>int main(int argc, char* argv[]) {google::InitGoogleLogging(argv[0]);LOG(INFO) << "这是一条信息日志";LOG(WARNING) << "警告: " << 42;LOG(ERROR) << "错误发生了!";return 0;
}

注意事项: glog 只能初始化一次,如果在库中使用需要考虑配置问题。

适用场景:

  • Google 技术栈项目
  • 需要稳定性的企业级应用
  • 单体应用程序

3. Boost.Log - 功能最强大的重型武器

Boost.Log 设计得非常模块化和可扩展。

核心特点:

  • 功能极其丰富
  • 高度可定制化
  • 支持复杂的过滤和格式化
  • 更像是构建自己日志库的框架

使用示例:

#include <boost/log/trivial.hpp>int main() {BOOST_LOG_TRIVIAL(info) << "这是一个测试 " << 123;return 0;
}

⚠️ 注意事项: 文档量巨大,学习曲线陡峭。

适用场景:

  • 复杂的企业级系统
  • 需要高度定制化的项目
  • 对功能要求极高的场景

🥈 第二梯队:各有特色的专业选手

4. log4cpp - 经典的Java Log4j移植版

Log4cpp 是一个 C++ 类库,用于灵活地记录日志到文件、syslog 和其他目的地,它模仿了 Java 的 Log4j 库。

核心特点:

  • 成熟稳定(2024年8月还在更新)
  • 支持多种输出目标(文件、syslog、IDSA 等)
  • 配置灵活
  • 线程安全,支持灵活和任意粒度的日志管理控制

使用示例:

#include "log4cpp/Category.hh"
#include "log4cpp/Appender.hh"
#include "log4cpp/FileAppender.hh"
#include "log4cpp/Layout.hh"
#include "log4cpp/BasicLayout.hh"int main() {log4cpp::Category& root = log4cpp::Category::getRoot();root.setPriority(log4cpp::Priority::WARN);log4cpp::Category& sub1 = log4cpp::Category::getInstance("sub1");sub1.info("这是一条信息日志");sub1.warn("警告日志");
}

适用场景:

  • 传统企业项目
  • 需要与Java系统保持一致的日志格式
  • 对稳定性要求高的系统

5. plog - 轻量级的简洁选择

plog 是一个可移植且简单的 C++ 日志库,代码少于1000行。

核心特点:

  • 代码量极少(<1000行)
  • 头文件库,易集成
  • 可移植、简单且可扩展
  • 轻量级但功能完整

使用示例:

#include <plog/Log.h>
#include <plog/Initializers/RollingFileInitializer.h>int main() {plog::init(plog::debug, "app.log"); // 初始化日志PLOGD << "这是调试信息";PLOGI << "程序启动成功";PLOGW << "这是警告: " << 42;PLOGE << "发生错误!";
}

适用场景:

  • 小型项目
  • 需要快速集成的场景
  • 对库大小敏感的项目

6. fmtlog - 纳秒级延迟的性能怪兽

fmtlog 是一个高性能的 fmtlib 风格的日志库,延迟达到纳秒级。

核心特点:

  • 纳秒级延迟性能
  • 使用 fmtlib 风格的API
  • 专为高频日志场景优化

使用示例:

#include "fmtlog/fmtlog.h"int main() {fmtlog::setLogFile("app.log");logd("这是调试信息: {}", 42);logi("程序启动成功");logw("警告: 数值 = {:.2f}", 3.14159);loge("错误发生: {}", "内存不足");fmtlog::poll(); // 处理异步日志return 0;
}

适用场景:

  • 高频交易系统
  • 实时性要求极高的应用
  • 对延迟敏感的系统

7. G3log - 异步安全的可靠选择

G3log 是带有动态 Sink 的异步日志器。

核心特点:

  • 异步且"崩溃安全"的日志器
  • 可以捕获致命事件如段错误
  • 动态Sink支持
  • 专为稳定性设计

使用示例:

#include <g3log/g3log.hpp>
#include <g3log/logworker.hpp>int main() {auto worker = g3::LogWorker::createLogWorker();auto handle= worker->addDefaultLogger("app", "./");g3::initializeLogging(worker.get());LOG(INFO) << "程序启动";LOG(WARNING) << "这是警告: " << 123;LOG(FATAL) << "严重错误"; // 会触发程序终止
}

适用场景:

  • 对稳定性要求极高的系统
  • 需要崩溃保护的应用
  • 长期运行的服务程序

🥉 第三梯队:新兴力量和特色选手

8. Quill - 现代化的异步日志库

Quill 是一个异步跨平台低延迟日志库。

核心特点:

  • 现代C++设计
  • 异步处理
  • 跨平台支持
  • 低延迟优化

9. reckless - 追求极致吞吐量

reckless 是一个低延迟、高吞吐量的异步日志库。

核心特点:

  • 极高的吞吐量
  • 专为性能优化
  • 异步处理机制

10. loguru - 轻量级的现代选择

loguru 是一个轻量级的 C++ 日志库。

核心特点:

  • 只有两个文件:loguru.hpp 和 loguru.cpp
  • 小巧简单的库设计
  • 头文件没有 #includes,编译速度快
  • 无依赖

性能大比拼:谁才是真正的速度之王?

根据各种基准测试和社区反馈,我们来看看性能排行:

超高性能级别

  1. fmtlog - 纳秒级延迟
  2. spdlog - 微秒级,平均性能优秀
  3. NanoLog - 纳秒级性能的日志系统

高性能级别

  1. G3log - 异步性能稳定
  2. Quill - 现代异步优化
  3. reckless - 高吞吐量专家

中等性能级别

  1. glog - 稳定可靠
  2. plog - 轻量级性能
  3. loguru - 简洁实用

功能优先级别

  1. Boost.Log - 功能丰富,性能适中
  2. log4cpp - 成熟稳定,性能传统

性能提示 : 在评估日志库时,不仅要看平均性能,还要关注最坏情况延迟,特别是在高负载场景下。


选择指南:哪个最适合你?

追求极致性能

推荐:spdlog + fmtlog

  • 适用:高频交易、游戏引擎、实时系统
  • 特点:微秒/纳秒级延迟,异步处理

企业级稳定性

推荐:glog + Boost.Log

  • 适用:企业应用、长期维护项目
  • 特点:成熟稳定,功能全面

轻量级快速开发

推荐:plog + loguru

  • 适用:小项目、原型开发、快速迭代
  • 特点:集成简单,代码量少

安全关键系统

推荐:G3log

  • 适用:系统软件、服务器应用
  • 特点:崩溃安全,异步可靠

💡 实战建议:如何选择和使用

评估维度

  1. 性能需求:QPS要求、延迟容忍度
  2. 功能需求:格式化、文件滚动、多线程
  3. 集成成本:学习曲线、依赖关系
  4. 维护成本:社区活跃度、文档质量
  5. 项目特点:团队规模、项目周期

最佳实践

  1. 先评估再选择:根据项目需求进行基准测试
  2. 统一团队标准:避免项目中使用多种日志库
  3. 合理设计日志级别:开发/测试/生产环境区别对待
  4. 关注性能影响:定期监控日志对系统性能的影响

🎉 写在最后:从使用到精通,就差这一步!

看到这里,相信你对C++日志库的选择已经心中有数了。但是,光会选择和使用是不够的

作为一个有追求的C++开发者,你是否想过:

  • 这些日志库的核心设计思想是什么?
  • 高性能是如何实现的?
  • 如何从零开始设计一个日志库?
  • 多线程、异步、性能优化的精髓在哪里?

知其然,更要知其所以然!

如果你想深入理解日志库的设计精髓,想拥有一个能写进简历的硬核项目,想在面试中自信地谈论高性能系统设计,我强烈推荐你看看我最近打磨完成的 MiniSpdlog 高性能日志系统实战项目:从 0 到 1 实现高性能日志库 MiniSpdlog — 这可能是最适合新手的日志系统实战项目 !

🔥 为什么推荐这个项目?

不是简单的代码教学,而是系统性的工程实践:

  • 2500行精品代码:不多不少,刚好能完全理解, 加上测试代码 总共 4700 行。
  • 核心功能完整:同步/异步、多 Sink、格式化、滚动文件
  • 性能优秀:单线程百万级吞吐,多线程几十万级
  • 架构清晰:参考 spdlog 设计,业界最佳实践
  • 可直接使用:带完整测试、性能优化、CMake 配置,开箱即用
  • 8天渐进式实现:从基础框架到高性能异步系统

这不是纸上谈兵,而是真刀真枪的实战:

  • 面试硬通货:80%的C++后台面试都会问日志相关问题
  • 简历加分项:一个完整的、性能优秀的开源项目经验
  • 技能全覆盖:一个项目学会10+个核心技术点
  • 生产级可用:不是Demo,而是真正能用的高质量代码

最重要的是,你将学会如何做性能分析和优化:

  • 使用 perf 工具 进行性能剖析
  • 找出性能瓶颈并针对性优化
  • 验证优化效果,掌握性能调优精髓

对项目感兴趣的朋友可以看这篇详细介绍:从 0 到 1 实现高性能日志库 MiniSpdlog — 这可能是最适合新手的日志系统实战项目 !

如何报名?

添加我的微信:jkfwdkf,备注「日志库

或者 扫描下方二维码,立即开始你的日志库实战之旅!

从看懂别人的代码,到自己能设计实现,就差这一步实战经验!

让我们一起,用8天时间,打造一个属于你自己的高性能日志库,为你的C++技能和职业发展加上最亮的一笔!💪

项目部分截图:
在这里插入图片描述
在这里插入图片描述
....

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/937085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

思想惰性:警惕时代中的精神惯性

思想惰性:警惕时代中的精神惯性 思想惰性,并非愚钝,而是一种清醒的妥协,一种在舒适区中滋长的意志松弛。它是心智面对复杂时的退缩,是灵魂回避深度思考的惯性。在信息爆炸的当下,这种惰性被技术包装成各类“权威…

完整教程:S7-200 SMART 开放式用户通信(OUC)深度指南:TCP/ISO-on-TCP(上)

完整教程:S7-200 SMART 开放式用户通信(OUC)深度指南:TCP/ISO-on-TCP(上)2025-10-14 20:55 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflo…

journalctl 查看服务日志

1. 使用 journalctl 查看完整日志bash# 查看服务的所有日志(从最早开始) sudo journalctl -u system-monitor# 查看完整日志并实时跟踪新日志 sudo journalctl -u system-monitor -f# 查看最近100行日志 sudo journa…

对ssh修改源码过程

一.下源代码(.src.rpm) 1.centos7 https://mirrors.tuna.tsinghua.edu.cn/ 2.rockylinux https://mirrors.zju.edu.cn/rocky/8.10/BaseOS/source/tree/Packages/o/3.下载命令 curl -O https://mirrors.zju.edu.cn/ro…

低代码时代,企业机遇在哪里

一、当 AI “走进” 低代码:一场温柔的开发革命 要是在 2023 年说 “用说话就能搭系统”,可能还会被当成玩笑;但到 2025 年,这已经成了低代码开发的日常。Gartner 有个预测:未来 70% 的企业应用会靠低代码构建,而…

2025 年浙江专升本培训学校推荐榜:浙江/台州/萧山/温州专升本机构,聚焦学历提升需求,杭州泓涵培训学校为学子护航

随着就业市场竞争加剧、专科生学历提升意识持续增强,专升本已成为众多学子拓宽职业发展路径、实现教育进阶的关键选择。尤其在浙江地区,杭州、台州、萧山、富阳、温州、绍兴等地的专升本报考热度逐年攀升,带动本地专…

25noip20d2t2 马戏表演 - Slayer

noip20d2t2 因为笨 写的详细一点。 题意 给定 n,m,对于长为 n 的排列 a,\(cnt_i=\sum_{1\leq l\leq i\leq r\leq n}[\max_{j=l}^r a_j=a_i]\)。求有多少排列 a 满足所有 \(cnt_i\) 都小于等于 m,答案对质数 p 取模。…

完整教程:port trunk pvid vlan vlan-id 概念及题目

完整教程:port trunk pvid vlan vlan-id 概念及题目pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…

从后端转行为AI工程师,转行AI大模型开发,附全套学习资源!收藏这份指南! - 实践

从后端转行为AI工程师,转行AI大模型开发,附全套学习资源!收藏这份指南! - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fon…

实验一:现代C++初体验

实验一 源代码 #include <iostream> #include <string> #include <vector> #include <algorithm>template<typename T> void output(const T &c);void test1(); void test2(); void…

2025秋_11

今天学习了Java

软件工程学习日志2025.10.14

🎯 今日任务 在Windows系统上完成MongoDB的安装、服务配置和连接测试。 ⚡ 遇到的问题与解决方案 问题1:PowerShell安全策略限制 错误信息: mongod: The term mongod is not recognized as a name of a cmdlet... …

CF1784E

对 DP 套 DP 的理解又加深了一分。 注意到,当局比分只有 \(0:0,0:1,1:0,1:1\) 四种情况,不妨将其压在一起考虑。 如何判断优劣?相当于从初始比分 \(0:0\),初始下标 \(i=1\) 开始发生 \(s\) 后续的一系列事件。 解决…

nSwitch 存档自动备份系统模块 - autoSAVE

autoSAVE 是switch大气层系统上使用的系统模块, 个人开发, 纯c语言编写, 执行效率高, 系统资源占用比较低. 主要解决日常有存档备份需求但不具备联网条件的痛点.下载地址 更新日志主要功能开袋即食, 无需配置 动态保留…

2025/10/14

2025/10/141.学习算法 2.学习离散数学 3.学习数据结构

CSP-S模拟31 笔记

CSP-S模拟31 笔记T1 远征 \(O(nV)\) DP。先鸽。 T2 传送 题目描述 给定 \(n\) 点 \(m\) 边无向无自环图 \(G\) , \(q\)次询问,每次询问给定点 \(x\) , \(y\) ,求点 \(x\) , \(y\) 在图 $G^′ $ 上的距离。 图 \(G^′…

java基础7-字符串

1.API(Application Programming Interface)应用程序编程接口 Java API:指的就是JDK中提供的各种功能的java类 2.String:字符串的内容是不会发生改变的,它的对象在创建之后不能被更改 创建String对象的两种方式:直…

乐云具身活动体验

Day -1 很早就看到这个活动的宣传了,“具身智能”、“上手实操”、“无需经验,只需热情”的宣传其实挺心动的,但考虑到之后国庆回来可能会很忙,而且最近事情已经够多了,于是忍痛放弃。但在报名截止前一天,林学长…

【技术解决方案】联邦学习中遇到的Non-IID问题——隐语SecretFlow

打开链接点亮社区Star,照亮技术的前进之路。每一个点赞,都是社区技术大佬前进的动力Github 地址: https://github.com/secretflow一、引言 本文针对联邦学习中遇到的Non-IID问题进行探讨,介绍Non-IID产生的原因,分…

10.14 闲话:KTT

10.14 闲话:KTT Part.1 基本算法 引入这样一个问题(其实这并不是板子,但是笔者认为这是此算法的另一种理解方式): luogu P5693 EI 的第六分块区间加,区间最大子段和。这东西有个十分重要的性质,所有加的数都是正…