【开源分享】spdlog,一款非常容易上手的 C++ 日志工具

日志库-Spdlog介绍 spdlog 是一个快速的、仅头文件的、C++11日志库,它提供了易于使用的接口和丰富的日志级别控制,同时支持异步日志记录。高性能:spdlog 设计用于高性能日志记录,支持异步日志记录,可以减少日志对应用程序性能的影响。简单易用:spdlog的API设计简洁,易于集成和使用。丰富的日志级别:支持多种日志级别,如TRACE、DEBUG、INFO、WARN、ERROR、CRITICAL等。多种日志输出:支持多种日志输出方式,包括控制台、文件、系统日志等。自定义格式:可以自定义日志输出格式。 阅读详情
AI摘要

本文介绍了高性能C++日志库spdlog,它能解决日志文件大小设置、异步存储、日志等级配置等问题。文中说明了其安装使用方法,包括获取、编译、使用示例及日志等级设置等,还对比了其他日志库,分析了优缺点,指出适合高性能低延迟场景。

在这里插入图片描述


1. 摘要

选一款日志工具,我们一般都考虑下面几个问题:

  1. 是否支持日志文件大小设置和循环存储?
  2. 是否支持异步存储?
  3. 是否支持日志等级配置?

spdlog 完美解决上面的问题,它是一款高性能的 C++ 日志库,专为低延迟和高吞吐量的日志记录需求设计。它支持多线程、异步日志、多种日志格式和输出目标,并且易于集成和使用。


2. 安装和使用

2.1 获取 spdlog

spdlog 是一个开源库,可以通过以下方式获取:

  • GitHub 仓库:从 spdlog GitHub 克隆或下载源码。
git clone https://github.com/gabime/spdlog.git
  • 包管理器:通过 vcpkg、Conan 等包管理器安装。
    • vcpkg:
	vcpkg install spdlog
  • Conan:
	conan install spdlog/1.x.x

2.2 编译 spdlog

spdlog 是一个仅有头文件的库(header-only),因此无需单独编译。只需将 include 目录添加到你的项目中即可。

如果需要使用异步日志功能,spdlog 依赖于一个单独的编译单元(spdlog.cpp),此时需要编译该文件:

g++ -std=c++11 -Iinclude -c src/spdlog.cpp -o spdlog.o

2.3 使用 spdlog

以下是一个简单的使用示例:

#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h" // 文件输出
#include "spdlog/sinks/stdout_color_sinks.h" // 控制台输出

int main() {
    // 创建一个控制台日志器
    auto console_logger = spdlog::stdout_color_mt("console");
    console_logger->info("Welcome to spdlog!");

    // 创建一个文件日志器
    auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/basic-log.txt");
    file_logger->info("This message will be written to a file.");

    // 设置全局日志级别
    spdlog::set_level(spdlog::level::debug);

    // 使用格式化日志
    spdlog::info("Hello, {}!", "world");
    spdlog::warn("This is a warning message.");
    spdlog::error("This is an error message.");

    // 刷新日志(确保所有日志被写入)
    spdlog::shutdown();
    return 0;
}

2.4 log 等级

spdlog 的日志等级用于区分日志消息的重要性或严重程度。它定义了多个日志级别,从最详细的跟踪信息到最严重的错误信息。以下是 spdlog 支持的日志等级及其含义:

enum level_enum : int {
    trace = SPDLOG_LEVEL_TRACE,			// 最详细的日志信息,通常用于调试或跟踪程序的执行流程。
    debug = SPDLOG_LEVEL_DEBUG,			// 调试信息,用于开发阶段排查问题。
    info = SPDLOG_LEVEL_INFO,			// 常规信息,用于记录程序的正常运行状态。
    warn = SPDLOG_LEVEL_WARN,			// 警告信息,表示可能存在问题,但不会影响程序运行。
    err = SPDLOG_LEVEL_ERROR,			// 错误信息,表示发生了错误,可能会影响程序的功能。
    critical = SPDLOG_LEVEL_CRITICAL,	// 严重错误信息,表示发生了致命错误,可能导致程序崩溃或无法继续运行。
    off = SPDLOG_LEVEL_OFF,				// 关闭所有日志记录。
    n_levels
};

2.5 日志等级的使用

  1. 设置全局日志等级:
    可以通过 spdlog::set_level 设置全局日志等级,低于该等级的日志消息将被忽略。
spdlog::set_level(spdlog::level::debug); // 只记录 debug 及以上级别的日志
  1. 设置单个日志器的日志等级:
    可以为每个日志器单独设置日志等级。
auto logger = spdlog::stdout_color_mt("console");
logger->set_level(spdlog::level::info); // 只记录 info 及以上级别的日志
  1. 记录不同等级的日志:
    使用 spdlog 提供的宏或方法记录不同等级的日志。
spdlog::trace("This is a trace message.");
spdlog::debug("This is a debug message.");
spdlog::info("This is an info message.");
spdlog::warn("This is a warning message.");
spdlog::error("This is an error message.");
spdlog::critical("This is a critical message.");
  1. 检查日志等级:
    可以通过 should_log 方法检查某个日志等级是否会被记录。
if (logger->should_log(spdlog::level::info)) {
    logger->info("This message will be logged.");
}

2.6 使用 spdlog

以下是一个简单的使用示例:

#include "spdlog/spdlog.h"
#include "spdlog/sinks/basic_file_sink.h" // 文件输出
#include "spdlog/sinks/stdout_color_sinks.h" // 控制台输出

int main() {
    // 创建一个控制台日志器
    auto console_logger = spdlog::stdout_color_mt("console");
    console_logger->info("Welcome to spdlog!");

    // 创建一个文件日志器
    auto file_logger = spdlog::basic_logger_mt("file_logger", "logs/basic-log.txt");
    file_logger->info("This message will be written to a file.");

    // 设置全局日志级别
    spdlog::set_level(spdlog::level::debug);

    // 使用格式化日志
    spdlog::info("Hello, {}!", "world");
    spdlog::warn("This is a warning message.");
    spdlog::error("This is an error message.");

    // 刷新日志(确保所有日志被写入)
    spdlog::shutdown();
    return 0;
}

2.7 集成和使用过程中要注意的点

  • 日志级别:spdlog 支持多种日志级别(trace, debug, info, warn, error, critical),根据需求设置合适的级别。

  • 多线程支持:spdlog 是线程安全的,可以在多线程环境中直接使用。

  • 异步日志:如果需要高性能日志记录,可以使用异步日志器(spdlog::async_logger),但需要注意内存占用和刷新策略。

  • 日志格式:spdlog 支持自定义日志格式,可以通过 set_pattern 方法设置。

  • 性能开销:尽管 spdlog 性能很高,但在高频日志场景中仍需注意性能开销,建议使用异步日志。

  • 资源释放:在程序退出前调用 spdlog::shutdown(),确保所有日志被刷新。


3. spdlog 与其他开源日志库的对比

在这里插入图片描述


4. spdlog 的优点

  • 高性能:专为低延迟和高吞吐量设计。

  • 易用性:header-only 设计,集成简单。

  • 灵活性:支持多种日志格式、目标和级别。

  • 异步日志:适合高性能场景。

  • 跨平台:支持 Windows、Linux、macOS 等。
    **

5. spdlog 的缺点

  • 功能相对简单:相比 Boost.Log 或 log4cxx,功能较少。

  • 异步日志的内存占用:在高负载下可能占用较多内存。

  • 依赖 C++11:不支持旧版 C++ 标准。


6. 总结

spdlog 是一个非常适合高性能、低延迟场景的日志库,尤其适合需要快速集成和使用的项目。如果需要更复杂的功能(如日志过滤、远程日志等),可以考虑 Boost.Log 或 log4cxx。


参考

【1】spdlog github 仓库
【2】【C++】spdlog光速入门,C++logger最简单最快的库
【3】spdlog日志库说明文档(超详细)
【4】封装 spdlog

异步日志方案——spdlog spdlog是一款开源的C++日志库,他有着极高的性能和几乎零成本的抽象。spdlog支持异步和同步日志记录,提供了多种日志级别,可以将日志打印在终端,文件或者自定义接收器(如数据库)。 阅读详情

相关推荐

[C++]-日志记录库SPDLog简介

文章目录spdlog库日志记录槽sink日志记录器logger输出格式pattern对齐方式截断字符串格式化fmtFormat Specificationspdlog使用异常处理logger基础用法stdout日志文件日志基本文件循环文件每日文件示例 spdlog是一款开源的、快速的日志库。 spdlog库 spdlog是基于C++11实现的一款纯头文件的日志管理库(git地址:https://github.com/gabime/spdlog,API说明:https://spdlog.docsforge.c

飞鹰技术 1万+

spdlog

spdlog是一个常见的第三方日志库,因为诸多优点得到青睐。这篇文章就对spdlog进行一个简单的介绍。内容主要围绕以下几个方面:一、spdlog的基本信息二、spdlog的基本概念三、spdlog的使用相关。

gls_nuaa的博客 1万+

C++依赖管理与高效日志实践:vcpkg与spdlog的完美结合

在C++开发中,依赖管理和日志记录是两大基础且关键的工程实践。依赖管理涉及第三方库的获取、编译和版本控制,传统手动方式常导致环境配置复杂和依赖冲突。包管理器通过自动化流程解决了这一问题,显著提升了开发效率和项目可重现性。日志记录则是软件监控、调试和运维的核心组件,一个高性能、易用的日志库能极大改善开发体验和系统可观测性。vcpkg作为微软推出的跨平台C++包管理器,提供了统一的依赖管理方案,而spdlog作为快速、仅头文件的C++日志库,以其高性能和灵活配置著称。将两者结合,开发者可以快速搭建稳定高效的C+

weixin_33404102的博客 260

C++高性能日志库spdlog使用指南

Spdlog 专注于提供极致的性能,在大量日志记录场景下也能保持较低的延迟和较高的吞吐量。

new9232的博客 3万+

C++通用工具库cpp-utilities:告别重复造轮子,提升开发效率

在C++开发中,字符串处理、文件操作、时间日期等基础功能是每个项目都绕不开的通用需求。这些看似简单的功能,若每次都从零实现或从网络拼凑,不仅效率低下,还会引入风格不一、质量参差不齐的代码,为项目埋下隐患。cpp-utilities正是为解决这一痛点而生的轻量级头文件库,它遵循现代C++标准,提供了一套经过充分测试、高效可靠的通用工具集。其核心价值在于通过模块化设计,将开发者从重复劳动中解放出来,让开发者能更专注于核心业务逻辑。无论是快速原型验证,还是需要长期维护的生产项目,cpp-utilities都能作为

anjueci1221的博客 346

深度解析大语言模型中的词向量

​ 在学习完语言模型中的编码器与解码器知识后,让我们继续深入学习大语言模型中一个非常关键的技术:词向量表示,以及如何通过Transformer模型实现对next token的预测。 ​

产品老A,8年互联网大厂AIPM,专注探索新型人机交互 3284

日志库spdlog二次封装,源码分享

spdlog是一个开源、快速、只有头文件的C++11日志库,code地址在https://github.com/gabime/spdlog,基础示例在https://github.com/gabime/spdlog#readme第一步:以上地址是源码,可以下载下来。进行初步的配置第二步:初步配置验证,用到自己的工程中,需要吧include文件夹copy到自己的工程目录下,配置包含目录为include目录第三步:二次封装成动态库调用使用.h文件和cpp文件//日志输出格式\n%v%$\n"

m0_68197012的博客 1830

LightRAG实战:5分钟快速搭建一个轻量级法律问答系统(附完整代码)

本文通过实战指南,详细介绍了如何使用LightRAG技术快速搭建一个轻量级法律问答系统。该方案通过构建扁平化实体关系网络和混合检索策略,在5分钟内即可完成从环境准备到智能问答的完整流程,并附有完整代码,为中小团队和个人开发者提供了高效、低成本的AI应用解决方案。

time3的博客 278

【C++】spdlog--log4cxx有点笨重,试一试spdlog

spdlog是什么 Fast C++ logging library 按照官方介绍,是一个高性能的C++日志组件,支持跨平台,兼容 C++11。原来项目中使用的是log4cxx,我感觉稍微有点笨重,并且很久没有更新了。 在新项目中,我只需要一款轻量级的日志组件,能: 存文件按照天数切分 快速的浏览了spdlog,满足我的需求,于是开...

小鱼菜鸟的博客 464

域控制器迁移后NETLOGON共享丢失的修复指南

本文详细解析了在Windows域控制器迁移后NETLOGON共享丢失的故障现象与修复方法。通过使用Dcdiag工具诊断,定位注册表键值SysVolReady异常及SCRIPTS目录缺失等核心原因,并提供了修改注册表、创建目录、重启Netlogon服务等逐步修复指南,帮助管理员快速恢复域用户登录功能,确保业务连续性。

weixin_29245767的博客 88

DOA估计算法从原理到仿真——CBF、Capon、MUSIC算法

从原理出发理解并实现经典的DOA估计算法

m0_55845774的博客 1万+

Qt下集成spdlog实现日志系统

本文将介绍如何在 Qt 项目中集成和使用高性能spdlog日志库,实现了一个线程安全的异步日志系统封装类,下面对我的示例进行分享,以便大家学习,如有错误之处,欢迎大家批评指正。

XCJandLL的博客 745

开关电源三大基本拓扑:反激、正激与桥式选型本质

开关电源拓扑是电力电子系统设计的核心基础概念,其本质决定能量传递路径、器件应力分布与系统物理边界。反激拓扑以耦合电感形式实现隔离与升降压,适用于小功率AC-DC场景;正激拓扑依赖实时能量传递与强制复位机制,支撑中功率高效率需求;桥式拓扑(含推挽/半桥/全桥)通过电压应力分摊与双向磁化,成为大功率系统的刚性选择。理解三者在磁芯工作模式、电流连续性、直流偏磁抑制等方面的原理差异,直接关系到效率、温升、EMI及可靠性等关键技术指标。本文聚焦反激、正激、桥式三大工程级基本拓扑的物理本质与落地约束,揭示从需求参数到电

cqwmy840702的博客 376

【C++ 基于微服务的即时通讯系统】基建三件套:gflags + gtest + spdlog 源码编译安装与实战入门

做 C++ 高性能后端开发这么多年,我见过太多新人一头扎进业务逻辑里,却忽略了最基础的工程化工具。命令行参数靠手搓、打日志全用 printf、单元测试全靠肉眼跑,不仅开发效率低,出了问题排查起来更是灾难。尤其是做 Redis 二次开发、微服务组件这类底层项目,gflags、gtest、spdlog 这三个基本是行业标配:gflags 搞定灵活的命令行参数管理,gtest 守住单元测试的质量关,spdlog 提供高性能的日志输出。今天就带大家从源码编译开始,从零到一搞定这三个工具的安装和基础使用,路上踩过的坑

会当凌绝顶,一览众山小 9427

不提交也不释放的事务,数据库连接还有可能被复用

摘要 实验发现Spring事务管理下,未提交事务的数据库连接池连接仍可被复用,这与传统认知相悖。通过配置HikariCP连接池(最大2连接)并设计测试接口,观察到未提交事务的连接会被后续请求复用。这可能导致GTID错误(当MySQL开启GTID且混用事务/非事务表时)以及数据修改丢失问题。研究揭示了Spring事务管理机制与连接池交互的特殊行为,对高并发系统设计具有重要启示。

蔡定努 177

深度解析与实战:长短时记忆网络(LSTM)在股票走势预测中的应用(基于Python + PyTorch)

本文全面探讨了LSTM在股票价格预测中的应用,从理论基础到实践操作。文章首先强调了股票市场预测的重要性,并介绍了LSTM网络结构及其在处理时间序列数据中的优势。接着,详细说明了数据预处理的关键步骤,包括数据收集、清洗、特征选择和归一化。文章还讨论了LSTM模型的构建、训练和评估,并提供了Python及PyTorch的实操案例。最后,总结了LSTM在股票预测的成果,并提出了未来研究的方向,如模型优化和特征工程,旨在帮助读者掌握LSTM在股票价格预测中的应用,并探索提升模型性能的方法。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2101

Log:日志选型调研『一』

文章目录关联背景日志库调研Google 关键词表格总结log4cxxLog4cpplog4clog4cplusgoogle glogz-logspdlogc-logsyslog-ngGitHub 搜索GItHub 村外有村总结成系列地址 简 述: 准备在个人的项目中添加 Log 日志模块,便于项目日后定位和调试。因前面数月,有感受到了日志的威力,故决定调研后选取一个合适的日志模块 spdlog 。最后意外的惊喜发现,检索需要一点技巧,可遇村外有村,好风凭借力。 本文初发于 “偕臧的小站”,同步转载

3577

【踩坑记录】colmap中的相机位姿的坐标系定义及其可视化结果的隐含转换

1 坐标系定义及转换   首先介绍一下世界坐标系和相机坐标系之间的转换,它们之间是存在一个转换关系的。现假设空间中一点X,它在相机坐标系下的坐标是Xcamera,在世界坐标系下的坐标是Xworld。假设它通过R和t实现从相机坐标系到世界坐标系之间的转换: Xworld = RXcamera + t   那么,由上式,我们可以推得从世界坐标系向相机坐标系的转换关系(RT=R-1,所以通常直接使用RT即可): Xcamera = RTXworld - RTt   所以,两个坐标系之间的转换,需要看其具体

zeeq的博客 2万+

CMake实战:如何用vcpkg一键搞定spdlog跨平台编译(附避坑指南)

本文详细介绍了如何通过vcpkg和CMake实现spdlog日志库的一键式跨平台编译与集成。内容涵盖vcpkg环境搭建、CMake配置优化、spdlog高级特性使用以及常见问题解决方案,帮助C++开发者高效管理项目依赖并构建高性能日志系统。

h3i4j的博客 841

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

spdlog社区资源:论坛、博客和开发者交流

spdlog作为C++生态系统中备受推崇的高性能日志库,拥有一个活跃且多样化的开发者社区。本文将全面介绍spdlog的社区资源体系,帮助开发者更好地参与社区交流、获取技术支持和贡献代码。 ## 核心社区平台 ### GitHub仓库 - 主要协作中心 spdlog的核心开发活动集中在GitHub平台上,这里是代码托管、问题跟踪和版本发布的主要场所。 ```mermaid graph TD ...

gitblog_00588的博客 923

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

glog归档后C++项目日志维护:核心机制解析与实战问题解决方案

日志系统是软件可观测性的基石,它记录了程序运行时的状态、事件和错误信息,帮助开发者进行调试、监控和问题诊断。其核心原理是通过预定义的级别(如INFO、ERROR)对信息进行分类,并持久化到文件或网络流中。在C++生态中,Google Logging(glog)因其高效稳定,长期被广泛应用于服务器后台和高性能计算场景。然而,随着glog于2025年6月正式归档,存量项目的维护与迁移成为开发者面临的实际工程挑战。理解glog的日志级别处理、文件滚动机制以及条件检查宏的性能陷阱,对于保障现有服务的稳定运行至关重要

weixin_33816821的博客 474

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

C/C++log日志库比较

C/C++log日志库比较

ugfffj的博客 283

10个提升开发效率的C++开源工具和库,建议收藏!

这篇我分享自己日常开发中踩过的坑、用过的宝,推荐10 个提升 C++ 开发效率的开源工具和库,从代码质量到构建系统,涵盖各个环节,一起打造高效工作流!

qq_29426201的博客 831

程序员经常看的开源月刊《HelloGitHub》第 56 期

兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣、入门级的开源项目。 这是一个面向编程新手、热爱编程、对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编程语言的项目、让生活变得更美好的工具、书籍、学习笔记、教程等,这些开源项目大多都是非常容易上手,而且非常 Cool。主要是希望大家能动手用起来,加入到开源社区中。 会编程的可以贡献代码 不会编程的可以反馈使用这些工具中的 Bug 帮着宣传你觉得优秀的项目 Star 项目⭐️ 在浏览、参与这些项目的过程.

HelloGitHub 的博客 5216

LIEF 日志引擎完全指南:C++/Python/Rust 三端 Logging API 深度解析

本篇指南围绕 LIEF 项目([doc/sphinx/api/logging/index.md](https://link.gitcode.com/i/76a3a4a93b2a44a3719181fbf07b7b28))的日志引擎展开,系统讲解 LIEF 基于 spdlog 构建的日志抽象层:从 `Level` 日志级别的层次语义、全局开关、文件重定向,到 C++/Python/Rust 三端对应

gitblog_00134的博客 1077

【AI大模型接入SDK】Trae IDE开发环境搭建指南

🎬 艾莉丝的简介:以 IDE 插件形态交付,依托现有编辑器底座提供 AI 编码增强能力,主流产品均兼容 VS Code 与 JetBrains 系列 IDE。无需图形化 IDE,直接在终端环境与大模型交互,适配服务器运维、纯终端开发场景。本项目选型 Trae IDE,核心原因是国内网络访问稳定、基础功能免费,且原生内置 Remote SSH,无需额外安装插件。Trae IDE 是基于 VS Code 内核、与 AI 深度集成的开发工具,提供智能问答、代码自动补全以及基于 Agent 的 AI 自动编程能力

艾莉丝努力练剑的博客,感谢大家一直以来的对艾莉丝的支持和鼓励,uu们如果对C/C++方向感兴趣的话,可以通过艾莉丝主页的微信名片加艾莉丝的好友,和努力练剑的艾莉丝一起加油! 10万+
上一篇: 啥是EPS?
下一篇: 什么是微服务架构?
智驾
博客等级 码龄11年 6671粉丝 574原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

智驾

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值