C++集成spdlog,spdlog基本使用方法

news2024/12/23 15:47:06

C++集成spdlog,spdlog基本使用方法

      • 何时输出日志
      • 第一步:集成 `spdlog` 到你的项目
        • 方法 1:使用包管理器(例如 vcpkg 或 conan)
        • 方法 2:手动集成
      • 第二步:基本使用
      • 第三步:设置日志级别
      • 第四步:使用日志文件、将日志输出到文件
        • 创建文件日志器
        • 设置默认日志器
      • 第五步:格式化消息
      • 第六步:清理
      • 异步日志记录
      • 日志旋转
      • 自定义格式
      • 多个日志目标
      • 总结

在软件开发中,日志记录是一个重要的功能,它帮助开发者了解应用程序的运行状态、诊断问题以及监控系统性能。对于算法工程师来说,合理地使用日志同样重要,尤其是在处理复杂的算法或数据处理任务时。以下是一些建议,可以帮助你更好地理解何时以及如何输出相关日志:

何时输出日志

  1. 错误和异常:当程序遇到错误或异常时,应记录相关信息,包括错误类型、错误消息以及可能的堆栈跟踪。这对于诊断问题至关重要。

  2. 状态变更:程序状态的重要变更,比如算法流程的开始和结束、关键步骤的完成等,都应该被记录。

  3. 重要决策:算法在处理数据时做出的重要决策点,例如模型选择、参数调整等,应当记录下来,以便于理解算法的运行过程。

  4. 性能监控:执行时间较长的操作或关键性能指标,如算法处理速度、内存使用情况等,也应记录,以帮助优化性能。

  5. 用户操作:如果应用程序与用户交互,用户的关键操作和选择也应被记录。

  6. 警告:不符合期望但不足以当作错误处理的情况,应以警告的形式记录。比如,使用了默认配置代替缺失的用户输入。

spdlog 是一个高效的 C++ 日志库,提供快速的日志记录功能。它支持多种输出目标,如控制台、文件、循环文件等,并且可以很容易地集成到 C++ 项目中。下面将逐步介绍如何使用 spdlog

第一步:集成 spdlog 到你的项目

方法 1:使用包管理器(例如 vcpkg 或 conan)

如果你使用的是像 vcpkgconan 这样的包管理器,你可以通过它们来安装 spdlog

  • 使用 vcpkg:

    vcpkg install spdlog
    
  • 使用 conan:

    conan install spdlog/[version]@
    
方法 2:手动集成
  1. 从 spdlog GitHub 下载源代码。
  2. spdlog 目录包含到你的项目中,并在你的编译器中设置包含路径。
  3. spdlog使用很方便就是将下载下来的包含到自己的include文件夹下就好,注意自己的项目包含目录要添加入include文件夹路径(一般最好为相对路径,类似于./include)
    在这里插入图片描述在这里插入图片描述

第二步:基本使用

首先,需要包含 spdlog 的头文件:

#include <spdlog/spdlog.h>

然后,你可以创建一个日志器并使用它来记录消息:

#include <spdlog/spdlog.h>

int main() {
    // 初始化控制台日志器
    spdlog::info("Welcome to spdlog!");
    spdlog::error("This is an error message");
    spdlog::warn("Warning message");
    spdlog::debug("Debug message"); // 默认情况下,debug和trace消息不会显示

    return 0;
}

第三步:设置日志级别

spdlog 支持多种日志级别:trace, debug, info, warn, error, critical, off。你可以设置全局日志级别,来控制哪些级别的日志应该被记录。

#include <spdlog/spdlog.h>

int main() {
    spdlog::set_level(spdlog::level::info); // 将只记录info及以上级别的日志

    spdlog::debug("此条消息不会被显示!");
    spdlog::info("此条消息会被显示.");

    return 0;
}

第四步:使用日志文件、将日志输出到文件

spdlog 也支持将日志输出到文件:

#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>

int main() {
    auto file_logger = spdlog::basic_logger_mt("file_logger", "logs.txt");
    spdlog::set_default_logger(file_logger);

    spdlog::info("Saved to logs.txt");

    return 0;
}

这段代码演示了如何使用 spdlog 将日志信息保存到一个文件中。下面是对各个部分的详细说明:

创建文件日志器
auto file_logger = spdlog::basic_logger_mt("file_logger", "logs.txt");

这行代码创建了一个名为 file_logger 的文件日志器,所有日志消息将被保存到当前目录下的 logs.txt 文件中。spdlog::basic_logger_mt 是一个工厂函数,用于创建并初始化一个多线程安全的文件日志器。

  • "file_logger" 是日志器的名称,它是一个标识符,可以用来在程序中引用这个特定的日志器。
  • "logs.txt" 指定了日志文件的路径和名称。如果文件不存在,spdlog 会自动创建它。
设置默认日志器
spdlog::set_default_logger(file_logger);

此函数调用将 file_logger 设置为默认日志器。这意味着,当使用不指定日志器名称的 spdlog 日志函数(如 spdlog::infospdlog::error 等)时,spdlog 将使用这个 file_logger 来记录日志消息。

第五步:格式化消息

spdlog 支持 Python 风格的消息格式化:

#include <spdlog/spdlog.h>

int main() {
    int user_id = 1001;
    spdlog::info("User {} logged in", user_id);

    return 0;
}

第六步:清理

默认情况下,spdlog 会在程序退出时自动清理所有资源。如果需要,也可以手动调用 spdlog::drop_all() 来清理所有日志器。

这是一个简单的介绍,spdlog 还有很多高级功能,比如日志旋转、异步日志记录、自定义格式等,你可以在 spdlog wiki 上找到更多的信息和高级主题。

spdlog 是一个高性能、灵活的日志记录库,除了基本的日志记录功能之外,它还提供了很多高级功能,比如异步日志记录、日志旋转、自定义格式和多个日志目标。下面讲解一些 spdlog 的进阶使用方法。

异步日志记录

异步日志记录可以显著提高应用程序的性能,因为它将日志消息的格式化和存储操作从主执行线程移到了后台线程。

#include <spdlog/async.h>
#include <spdlog/sinks/basic_file_sink.h>

int main() {
    spdlog::init_thread_pool(8192, 1); // 创建异步日志记录的线程池
    auto async_file_logger = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", "async_log.txt");
    spdlog::set_default_logger(async_file_logger);

    spdlog::info("This is an async log message");

    return 0;
}

在这个例子中,我们首先通过 spdlog::init_thread_pool 初始化了一个线程池,然后使用 spdlog::basic_logger_mt<spdlog::async_factory> 创建了一个异步的文件日志器。

日志旋转

日志旋转是一种常见需求,用于控制日志文件的大小和数量,防止日志文件占用过多的磁盘空间。

#include <spdlog/sinks/rotating_file_sink.h>

int main() {
    auto rotating_logger = spdlog::rotating_logger_mt("rotating_logger", "rotating_log.txt", 1024 * 1024 * 5, 3);
    spdlog::set_default_logger(rotating_logger);

    for(int i = 0; i < 10000; ++i) {
        spdlog::info("This is a rotating log message {}", i);
    }

    return 0;
}

这个例子创建了一个名为 rotating_logger 的日志器,它会将日志消息保存到 rotating_log.txt。日志文件的最大大小被设置为5MB,最多保留3个日志文件。当当前日志文件达到5MB时,spdlog 会自动创建一个新的日志文件,并在有必要时删除最旧的日志文件。

自定义格式

spdlog 允许你自定义日志消息的格式,这通过设置模式字符串来实现。

#include <spdlog/spdlog.h>

int main() {
    spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [thread %t] %v");
    spdlog::info("This is a custom formatted log message");

    return 0;
}

这个例子中,我们设置了一个新的日志格式,它包括时间戳、日志级别、线程ID和实际的日志消息。

多个日志目标

spdlog 支持同时将日志消息发送到多个目标,比如同时输出到控制台和文件。

#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/sinks/basic_file_sink.h>

int main() {
    auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();
    auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("multi_sink_log.txt");

    spdlog::logger multi_sink_logger("multi_sink", {console_sink, file_sink});
    multi_sink_logger.set_level(spdlog::level::info);
    multi_sink_logger.info("This log message goes to both console and file");

    return 0;
}

在这个例子中,我们创建了两个日志汇(sink):一个用于控制台输出,另一个用于文件输出。然后,我们创建了一个 spdlog::logger 对象,同时传入了这两个汇。这样,所有通过这个日志器记录的消息都会同时出现在控制台和文件中。

总结

spdlog 提供的这些高级功能使其成为一个非常强大和灵活的日志库,适用于各种不同的日志记录需求。通过利用这些高级功能,你可以更好地控制日志记录的行为,优化应用程序的性能,以及改善日志的可读性和可管理性。

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

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

相关文章

后端开发刷题 | 反转链表【链表篇】

描述 给定一个单链表的头结点pHead(该头节点是有值的&#xff0c;比如在下图&#xff0c;它的val是1)&#xff0c;长度为n&#xff0c;反转该链表后&#xff0c;返回新链表的表头。 数据范围&#xff1a; 0≤n≤1000 要求&#xff1a;空间复杂度 O(1) &#xff0c;时间复杂度…

xss 漏洞复现

xss 漏洞复现 一&#xff0c;xss game 1&#xff0c;源码 <!-- Challenge --> <h2 id"spaghet"></h2> <script>spaghet.innerHTML (new URL(location).searchParams.get(somebody) || "Somebody") " Toucha Ma Spaghet!…

Centos7离线安装Sumo全过程(xerces-c、Cmake、gymnasium等)

在 Linux 环境下使用 Python 调用 SUMO 进行相关训练时&#xff0c;通常需要先安装 SUMO。然而&#xff0c;在某些情况下&#xff0c;网络连接可能不可用&#xff0c;因此本文提供了 SUMO 的离线安装方法。 Step1&#xff1a;检查基础依赖包是否完整 基本的依赖项如果有别的缺…

机械学习—零基础学习日志(如何理解概率论2)

全概率公式与贝叶斯公式 上面所提到的公式&#xff0c;可以使用上一篇文章的基本公式推导。 使用到了概率的基本运算公式。 完整的公式展示&#xff1a; 习题练习&#xff1a; 剩余的练习&#xff1a; 第二题解析&#xff1a; 第三题&#xff1a; 第四题&#xff1a; 注意&…

酒店管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图详细视频演示技术栈系统测试为什么选择我官方认证玩家&#xff0c;服务很多代码文档&#xff0c;百分百好评&#xff0c;战绩可查&#xff01;&#xff01;入职于互联网大厂&#xff0c;可以交流&#xff0c;共同进步。有保障的售后 代码参考数据库参…

Navicat Premium Lite: 简化版的数据库管理和开发工具

Navicat Premium 一直是世界各地数据库专业人士需要从一个应用程序同时连接到多种数据库平台的选择。现在&#xff0c;Navicat Premium Lite 为只需要基本数据库操作所需的核心功能的用户提供简化版的数据库管理体验。在今天的博客中&#xff0c;我们将介绍 Navicat Premium Li…

【案例46】Oracle更换数据库密码后产生Library Cache Lock导致系统卡死

问题现象 WAS环境&#xff0c;服务起不来&#xff0c;改成单机版后能登录&#xff0c;打不开节点。直接卡死。 问题分析 经过顾问反馈&#xff0c;在启动环境时&#xff0c;中间件卡住不动&#xff0c;怀疑数据源不通导致&#xff0c;于是使用checkDB脚本发现desgin数据源用…

leaflet如何为geoJson图层设置zIndex图层顺序?

这个问题也是纠结了半天&#xff0c;两个geojson的面图层作为Layer&#xff0c;因所画的内容重要程度不同&#xff0c;总有主次之分&#xff0c;比如标记型的图标&#xff0c;即使被盖住了&#xff0c;也无伤大雅&#xff0c;但是一些监控或者告警的数据&#xff0c;如果被盖住…

Stable Diffusion绘画 | ControlNet应用-Scribble (涂鸦)

Scribble (涂鸦) 使用该算法生成的线稿&#xff0c;线条最粗最随意&#xff0c;常用于抓取画面的大体轮廓&#xff0c;让AI进行创意发挥。 提示词输入 a panda&#xff0c;生成图片如下&#xff1a; 将提示词换成 a dog&#xff0c;生成图片如下&#xff1a; 今天先分享到这里…

海康相机opencv,C++调用demo配置记录

海康相机opencv&#xff0c;C调用demo配置记录 配置&#xff1a;1.Opencv4.6.0 2.MVS 3.Vs2019 第一章、相关文件 一、demo文件 在安装好mvs后&#xff0c;相应文件夹中&#xff0c;会有样例文件。默认安装mvs的话&#xff0c;文件在目录&#xff1a; C:\Program Files (x…

C++:C/C++的内存管理

目录 C/C内存分布 C语言中动态内存管理方式 C内存管理方式 new/delete操作内置类型 new/delete操作自定义类型 operator new与operator delete函数 new和delete的实现原理 定位new表达式 常见问题 malloc/free和new/delete的区别 内存泄漏 C/C内存分布 我们先来看以…

STM32 定时器 输入捕获

用于测频率测占空比 IC(Input Capture)输入捕获 输入捕获模式下&#xff0c;当通道输入引脚出现指定电平跳变&#xff08;上升沿/下降沿&#xff09;时&#xff0c;会让当前CNT的值将被锁存到CCR中&#xff0c;可用于测量PWM波形的频率、占空比、脉冲间隔、电平持续时间等参数…

探索ChatGPT:一场AI语言模型的革命

前言 随着人工智能&#xff08;AI&#xff09;的不断发展&#xff0c;越来越多的技术在日常生活和工作中得到了广泛应用&#xff0c;ChatGPT作为一种基于GPT-4架构的自然语言处理模型&#xff0c;正引领着AI对话系统的新时代。本文将带你深入了解ChatGPT的背景、应用以及未来发…

python动画:矢量图形的体系结构演示

总体来说&#xff0c;这些类构成了一个支持矢量图形的体系结构&#xff0c;提供了创建、管理和操作数学对象的灵活性。描述使用矢量图形的 Mobject&#xff08;数学对象&#xff09;的术语。这些对象在动画和数学绘图领域常用于创建灵活和可扩展的图形。 1.CurvesAsSubmobject…

中学理化生实验室设备仪器配置及实验应用

中学理化生实验室设备涵盖了物理、化学和生物三个学科所需的多种仪器、设备和材料&#xff0c;实验室设备的种类丰富多样&#xff0c;涵盖了从基础配备到专业配置再到实验应用等各种需求。以下是对这些设备的配置分类和具体实验应用的描述。 中学理化生实验室设备仪器配置 中…

一起学习CAN总线之物理层协议(2)

附&#xff1a;ISO 11898-1:2024和ISO11898-2:2024标准下载 一起学习CAN总线之物理层协议&#xff08;2&#xff09; CAN总线物理层主要完成节点间信号的传送&#xff0c;把各种信息转换成可以传输的物理电平&#xff0c;并将信号传输到其他的目标设备上。CAN总线传输介质&…

智慧排水远程监测系统物联网解决方案

智慧排水监测系统是一种集成了现代信息技术、物联网技术、大数据分析及云计算能力的高效城市排水管理解决方案。该系统通过全面、实时地监控城市排水网络的运行状态&#xff0c;旨在预防内涝灾害&#xff0c;优化水资源管理&#xff0c;保障城市安全运行&#xff0c;促进可持续…

零基础如何入门网络安全?网络安全难吗?

零基础如何入门网络安全 我经常会看到这一类的问题&#xff1a; 学习XXX知识没效果&#xff1b;学习XXX技能没方向&#xff1b;学习XXX没办法入门&#xff1b; 给大家一个忠告&#xff0c;如果你完全没有基础的话&#xff0c;前期最好不要盲目去找资料学习&#xff0c;因为大…

windows系统如何走后面之windows系统隐藏账户

系统隐藏账户是一种最为简单有效的权限维持方式&#xff0c;其做法就是让攻击者创建一个新的具有管理员权限的隐藏账户&#xff0c;因为是隐藏账户&#xff0c;所以防守方是无法通过控制面板或命令行看到这个账户的。 自然我们需要一些前提条件&#xff0c;比如说有一个网站&am…

【unity小技巧】获取免费开源的人物模型,并为obj fbx人物模型绑定骨骼、动画——mixamo的使用介绍

文章目录 前言地址上传自己的3D角色下载单动画下载动作包角色模型导入Unity动画导入unity设置动画骨骼动画骨骼不配的问题参考完结 前言 其实前面我已经推荐了几种获取人物模型的方法&#xff1a; 1、【unity小技巧】下载原神模型&#xff0c;在Blender中PMX模型转FBX模型&…