Spdlog日志库的安装配置与源码解析(Linux)

为什么使用日志库而不是控制台输出?

日志库通常提供了更丰富的功能,比如可以设置日志输出级别、输出到不同的目标(比如控制台、文件、网络等),以及格式化输出等。

使用日志库可以使代码更易于维护。通过统一的日志接口,可以更容易地对日志输出进行修改、调整和管理,而不需要在代码的各个地方进行修改。

使用日志库可以优化性能,比如通过缓冲输出、异步写入等方式来减少对程序性能的影响。而直接使用 cout 可能会导致频繁的 IO 操作,影响程序的性能。

Spdlog是一个高效的日志库,具有以下优点:它只包含一个头文件,因此易于集成;其速度快且无需依赖第三方库,支持跨平台和多线程操作,保证线程安全;可对日志文件进行循环输出并每日生成新的日志文件;支持控制台输出,可选的异步输出,同时允许用户自定义日志格式。

编译安装

环境是Linux Ubuntu 20.04, 采取源码安装方式。Cmake构建项目。

首先在Spdlog的github仓库中下载最新的源代码

git clone https://github.com/gabime/spdlog.git

进入源代码目录然后创建"build"目录:

cd spdlog
mkdir build
cd build

在build目录中执行编译命令:

cmake ..
make
sudo make install

将编译生成的库文件安装到系统指定的目录下,这样你可以在任何地方使用这个库,或者也可以以源码形式引入,拷贝include文件夹到你的构建树。

cmake_minimum_required(VERSION 3.10)
project(spdlog_examples CXX)if(NOT TARGET spdlog)# Stand-alone buildfind_package(spdlog REQUIRED)
endif()# ---------------------------------------------------------------------------------------
# 使用预编译的库
# ---------------------------------------------------------------------------------------
add_executable(example example.cpp)
target_link_libraries(example PRIVATE spdlog::spdlog)# ---------------------------------------------------------------------------------------
# 使用头文件库
# ---------------------------------------------------------------------------------------
if(SPDLOG_BUILD_EXAMPLE_HO)add_executable(example_header_only example.cpp)target_link_libraries(example_header_only PRIVATE spdlog::spdlog_header_only)
endif()

在example.cpp中编写以下代码:

#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/cfg/env.h>  // support for loading levels from the environment  variable
#include <spdlog/fmt/ostr.h> // support for user defined types
using namespace std;
using namespace spdlog;
int main()
{spdlog::cfg::load_env_levels();spdlog::info("Welcome to spdlog version {}.{}.{}  !", SPDLOG_VER_MAJOR,  SPDLOG_VER_MINOR, SPDLOG_VER_PATCH);spdlog::warn("Easy padding in numbers like {:08d}", 12);spdlog::critical("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin:  {0:b}", 42);spdlog::info("Support for floats {:03.2f}", 1.23456);spdlog::info("Positional args are {1} {0}..", "too", "supported");spdlog::info("{:>8} aligned, {:<8} aligned", "right", "left");return 0;
}

在这里插入图片描述

项目构成

spdlog项目采用CMake构建,其一级目录结构如下

$ tree -L 1
.
├── CMakeLists.txt             // 根目录CMake文件
├── INSTALL                    // 安装说明
├── LICENSE                    // license声明文件
├── README.md                  // 项目介绍文档
├── appveyor.yml               // 用于自动化构建, Windows构建平台的配置
├── bench                      // benchmark, 用于综合测试
├── build                      // 用于存放编译过程产生的中间文件
├── cmake                      // 用于存放与cmake构建项目有关的文件
├── example                    // 用户例程
├── include                    // 头文件根目录
├── logos                      // 用于存放logo
├── scripts                    // 存放脚本文件
├── src                        // 源码目录
└── tests                      // 单元测试目录

源码解读见本人其他blog

  • 线程池thread_pool
  • 自定义异常类spdlog_ex
  • 格式化类formatter
  • 日志记录器logger类
  • 输出通道sink
  • 全局管理类registry

代码编写

spdlog中logger对象和sink对象都有两种版本,一种是以st结尾的单线程版本,以及以mt结尾的多线程版本。

st:单线程版本,不用加锁,效率更高。
mt:多线程版本,用于多线程程序是线程安全的。

写入控制台

#include<iostream>
#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_sinks.h>
void stdout_easy()
{// 根据参数“consoel”的名字在内部创建了一个logger,函数返回值就是这个logger的智能指针。//stdout_logger_mt就是控制台输出auto console = spdlog::stdout_logger_mt("console");// 直接通过智能指针调用名字对应“console”的logger对象的函数进行输出。console->info("hello world");//下面代码一样的效果//spdlog::get("console")->info("hello world");
}
int main() 
{stdout_easy();return 0;
}

在这里插入图片描述

写入文件

#include<iostream>
#include<spdlog/spdlog.h>
#include<spdlog/logger.h>
#include<spdlog/sinks/basic_file_sink.h>
int main()
{// 创建一个名为basic_logger的日志记录器,并且返回指针。// mt表示多线程,意味着多个线程中使用同一个日志记录器。// 需要注意的是在文件内添加数据是通过追加的形式进行的,并且如果没有创建文件会自动创建文件。auto basic_logger = spdlog::basic_logger_mt("basic_logger", "basic_log.txt");for(int i=0; i<10; i++){basic_logger->info("Test file logger{}", i);}return 0;
}

在这里插入图片描述

剩余功能均可在源码阅读中,或项目构成中的example中找到,不多赘述。

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

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

相关文章

Opencv学习项目2——pytesseract

上一次我们使用pytesseract.image_to_boxes来检测字符&#xff0c;今天我们使用pytesseract.image_to_data来检测文本并显示 实战教程 和上一次一样&#xff0c;添加opencv-python和pytesseract库 首先我们先来了解一下pytesseract.image_to_data pytesseract.image_to_data(…

红队内网攻防渗透:内网渗透之内网对抗:横向移动篇入口切换SMB共享WMI管道DCOM组件Impacket套件CS插件

红队内网攻防渗透 1. 内网横向移动1.1 WMI进行横向移动1.1.1 利用条件:1.1.1 利用详情1.1.1.1 wmic1.1.1.1.1 正向shell上线1.1.1.1.2 反向shell上线1.1.1.2 cscript(不建议使用)1.1.1.3 wmiexec-impacket1.1.1.4 cs插件1.2 SMB横向移动1.2.1 利用条件:1.2.2 利用详情1.2.2…

基于YOLOv5的火灾检测系统的设计与实现(PyQT页面+YOLOv5模型+数据集)

基于YOLOv5的火灾检测系统的设计与实现 概述系统架构主要组件代码结构功能描述YOLOv5检测器视频处理器主窗口详细代码说明YOLOv5检测器类视频处理类主窗口类使用说明环境配置运行程序操作步骤检测示例图像检测视频检测实时检测数据集介绍数据集获取数据集规模YOLOv5模型介绍YOL…

对日期的处理

对日期的处理 对编码进行统一&#xff0c;在脚本最开始&#xff1a; # -*- coding: utf-8 -*-这里涉及到两个操作&#xff0c;一个是将数据进行标准化&#xff0c;比如有些日期是2024/05/06这并不符合日期的标准格式&#xff0c;需要转换成这样的2024-05-06 def tran_std(st…

java基于ssm+jsp 社区疫情防控管理信息系统

1前台首页功能模块 社区疫情防控管理信息系统&#xff0c;在社区疫情防控管理信息系统可以查看首页、物品信息、论坛信息、新闻资讯、我的、跳转到后台等内容&#xff0c;如图1所示。 图1系统首页界面图 用户登录、用户注册&#xff0c;通过注册填写账号、密码、姓名、身份证、…

正则表达式,linux文本三剑客

正则表达式匹配的是文本内容&#xff0c;linux的文本三剑客都是针对文本内容&#xff0c;按行进行匹配 文本三剑客&#xff1a; grep 过滤文本内容 sed 针对文本内容进行增删改查 awd 按行取列 一.grep命令 作用就是使用正则表达式来匹配文本内容 -m 数字&#xff1a;匹配…

在linux系统中使用docker、mysql实例

systemctl 是一个命令行工具&#xff0c;用于控制和管理基于 systemd 的 Linux 发行版中的系统和服务。 启动服务 &#xff1a;使用 systemctl start [service-name] 开始一个服务。 如启动docker&#xff1a;systemctl start docker 停止服务 &#xff1a;使用 systemctl st…

直播预约丨《袋鼠云大数据实操指南》No.3:数据资产管理实操,如何有效进行数据治理

近年来&#xff0c;新质生产力、数据要素及数据资产入表等新兴概念犹如一股强劲的浪潮&#xff0c;持续冲击并革新着企业数字化转型的观念视野&#xff0c;昭示着一个以数据为核心驱动力的新时代正稳步启幕。 面对这些引领经济转型的新兴概念&#xff0c;为了更好地服务于客户…

[Shell编程学习路线]——While循环应用技巧 (详细讲解)

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f6e0;️Shell编程专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年6月20日16点30分 &#x1f004;️文章质量&#xff1a;95分 目录 ————前言———— 基本结构 图示原理 示例 测试 …

链动2+1模式:解锁用户留存与复购的增长密码

大家好&#xff0c;我是吴军&#xff0c;来自一家业界领先的软件开发公司&#xff0c;专注于为用户打造卓越的产品体验。今天&#xff0c;我想与大家探讨一个在我们产品运营中取得显著成效的策略——链动21模式&#xff0c;以及它是如何助力我们提升用户留存和复购率的。 尽管链…

Android13 WMS窗口层级树

1&#xff0c;认识层级树 可以通过dumpsys activity containers 看到 WMS 层级树的结构 ACTIVITY MANAGER CONTAINERS (dumpsys activity containers) ROOT typeundefined modefullscreen override-modeundefined requested-bounds[0,0][0,0] bounds[0,0][1440,2960]#0 Displa…

中国能源统计年鉴(1986-2023年)

数据年份&#xff1a;1986-2023年&#xff0c;无1987、1988、1990三年&#xff0c;1991-2023年齐 数据格式&#xff1a;pdf、excel 数据内容&#xff1a;《中国能源统计年鉴》是一部反映中国能源建设、生产、消费、供需平衡的权威性资料书。 共分为7个篇章&#xff1a;1.综合&a…

51-52Windows密码安全性测试与Windows提权

目录 Windows密码安全性测试 一、本地管理员密码如何直接提取 1、直接通过mimikatz读取管理员密码 2、使用laZagne工具读取管理员密码 二、利用Hash远程登录系统 window提权 三、远程webshell执行命令解决 不能执行原因&#xff1a; 解决方法&#xff1a;单独上传cmd.e…

linux系统cpu飙高如何排查

1.通过top命令查看cpu占比较高的进程ID 2.通过top -H -p <进程ID>命令查看该进程中具体线程&#xff0c;可以看到第一个线程 4311 占用了88.2%的cpu 3.通过 printf "%x\n" <线程ID> 把10进制的线程id转为16进制 4.通过jstack <进程ID> | grep &…

【大疆pocket3】到手后5个必改初始设置关键点(下)

【大疆pocket3】到手后5个必改初始设置关键点&#xff08;下&#xff09; 一&#xff0c;简介二&#xff0c;必改关键点2.1 数字变焦2.2 慢动作拍摄2.3 神奇的小摇杆2.4 云台模式使用方法&#xff08;默认增稳模式和俯仰角锁定的差异化以及使用场景&#xff09;2.5 云台转向速度…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《基于已知电网场景分段拟合智能体智能评估与自主进化方法 》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

为什么 JakeWharton 建议:App 只要用到一个 Activity ?

我们来看看这条回答都提到了哪些内容&#xff0c;对 Activity 和 Fragment 之间的爱恨情仇有何独到的见解&#xff0c;凭什么能得到 JakeWharton 本尊的青睐有加。 因为 Activity 是一个程序入口。你可以将其视为 app 的一个 main 函数。站在用户的立场上&#xff0c;通常你进入…

cesium 包络线

cesium 包络线 以下为源码直接复制可用 1、实现思路 通过turf.js中union方法来计算包络线官方地址:https://turfjs.fenxianglu.cn/ 闪烁线请查看cesium轨迹线(闪烁轨迹线) 2、示例代码 <!DOCTYPE html> <html lang="en"&g

Vue3中使用el-table遇到的问题

我在使用element-plus中el-table组件的时候&#xff0c;对于某一<el-table-column>标签内的内容设置show-overflow-tooltip属性&#xff0c;但这里溢出展示的tooltip的默认样式是无法像el-tooltip标签那样&#xff0c;直接可以修改的。默认的样式是这样&#xff1a; 因此…

1.树莓派4b+ubuntu18.04(ros版本melodic)+arduino mega自制两轮差速小车,实现建图导航功能

第一篇先介绍材料准备、环境配置和ros的安装 1.材料准备 1.树莓派4b&#xff0c;8g版本 2.arduino mega 3.MG310编码电机*2 4.雷达ydlidar X3 5.Tb6612电机驱动板 6.12v电池 7.ubuntu18.04ros melodic版本 2.环境配置 树莓派安装ubuntu18.04版本 ubuntu18.04版本的镜像可以…