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

news2025/1/12 1:02:12

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

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

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

使用日志库可以优化性能,比如通过缓冲输出、异步写入等方式来减少对程序性能的影响。而直接使用 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 build
    find_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.coloradmin.cn/o/1854424.html

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

相关文章

【web2】jquary,bootstrap,vue

文章目录 1.jquary&#xff1a;选择器1.1 jquery框架引入&#xff1a;$("mydiv") 当成id选择器1.2 jquery版本/对象&#xff1a;$(js对象) -> jquery对象1.3 jquery的页面加载事件&#xff1a;$ 想象成 window.onload 1.4 jquery的基本选择器&#xff1a;$()里内容…

计算机网络知识点汇总(三)

1.2 计算机网络体系结构与参考模型 1.2.1 计算机网络分层结构 计算机网络的各层及其协议的集合称为网络的体系结构(Architecture)。换言之&#xff0c;计算机网络的体系结构就是这个计算机网络及其所应完成的功能的精确定义。要强调的是&#xff0c;这些功能究竟是用何种硬件…

探索FlowUs息流:个人和团队知识管理稳定解决方案|FlowUs稳定保障你的笔记安全无忧

FlowUs息流&#xff1a;稳定运营保障你的笔记安全无忧 在知识管理工具的选择上&#xff0c;稳定性是用户最关心的问题之一。FlowUs息流以其稳定的运营记录&#xff0c;为用户提供了一个可靠的工作环境。我们深知&#xff0c;一个知识管理平台的稳定性直接影响到团队的生产力和…

阿里云推出首个 AI 程序员!

AI圈最近又发生了啥新鲜事&#xff1f; 该栏目以周更频率总结国内外前沿AI动态&#xff0c;是快速了解AI发展趋势一个不错的方式&#xff0c;感兴趣的可以点击订阅合集以及时收到最新推送 DeepSeek Coder V2开源发布&#xff0c;首超GPT4-Turbo的代码能力 全球首个在代码、数…

告别繁琐邀请码,Xinstall助你轻松搭建高效App推广体系!

随着互联网流量的不断变迁&#xff0c;App推广和运营面临着前所未有的挑战。如何快速搭建起满足用户需求的运营体系&#xff0c;成为众多企业亟待解决的问题。在这个背景下&#xff0c;Xinstall凭借其强大的功能和灵活的解决方案&#xff0c;成为了App推广的得力助手。 一、传…

【IVIF】Equivariant Multi-Modality Image Fusion

2024CVPR Zixiang Zhao团队 分析透彻&#xff0c;方法耳目一新 统一融合架构 1、Motivation Our approach is rooted in the prior knowledge that natural imaging responses are equivariant to certain transformations 我们的方法根植于自然成像响应对于某些变换的等变性…

线程C++

#include <thread> #include <chrono> #include <cmath> #include <mutex> #include <iostream> using namespace std;mutex mtx; void threadCommunicat() {int ans 0;while (ans<3){mtx.lock();//上锁cout << "ans" <…

MongoDB数据库的安装和删除

MongoDB数据库的删除和安装 1、删除MongoDB数据库2、下载MongoDB数据库1)、自定义安装2)、注意可视化可以取消勾选 1、删除MongoDB数据库 没有下载过的&#xff0c;可以直接跳到下面的安装过程↓ 我们电脑中如果有下载过MongoDB数据库&#xff0c;要更换版本的话&#xff0c;其…

opencascade AIS_InteractiveContext源码学习5 immediate mode rendering 即时模式渲染

AIS_InteractiveContext 前言 交互上下文&#xff08;Interactive Context&#xff09;允许您在一个或多个视图器中管理交互对象的图形行为和选择。类方法使这一操作非常透明。需要记住的是&#xff0c;对于已经被交互上下文识别的交互对象&#xff0c;必须使用上下文方法进行…

安卓中使用ttf字体文件

官方文档中提供的方法要设备能访问google&#xff1f; 官方方法 直接下载字体的fft文件 我要使用的是lexend 需要的格式可以在里面搜索 使用下载的ttf文件 解压出来 可以单独使用static里面的&#xff0c;里面是直接的lexend的各种格式 但是我这里直接使用Lexend-Vari…

塞贝壳效应

塞贝克效应&#xff08;Seebeck effect&#xff09;&#xff0c;通常被称为第一热电效应&#xff0c;是由托马斯约翰塞贝克&#xff08;Thomas Johann Seebeck&#xff09;在1821年发现的一种热电现象。这个效应描述了当两种不同的导体或半导体在它们的接点处有温度差时&#x…

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

简介 随着电子设备的广泛应用,PCB(印刷电路板)作为其核心部件,其质量和可靠性至关重要。然而,PCB生产过程中常常会出现各种缺陷,如鼠咬伤、开路、短路、杂散、伪铜等。这些缺陷可能导致设备故障,甚至引发严重的安全问题。为了提高PCB检测的效率和准确性,我们基于YOLOv…

路经总和-二叉树题

112. 路径总和 - 力扣&#xff08;LeetCode&#xff09; 1、用队列 两个队列&#xff0c;先进先出 node队列存节点&#xff1b; sum队列存每条路径走到这个节点的val的总和&#xff1b; 节点和总和对应着同时存入队列&#xff0c;同时出队列&#xff1b; class Solution …

如何关闭软件开机自启,提升电脑开机速度?

如何关闭软件开机自启&#xff0c;提升电脑开机速度&#xff1f;大家知道&#xff0c;很多软件在安装时默认都会设置为开机自动启动。但是&#xff0c;有很多软件在我们开机之后并不是马上需要用到的&#xff0c;开机启动的软件过多会导致电脑开机变慢。那么&#xff0c;如何关…

基于I2C协议的AHT20温湿度传感器的数据采集

一、I2C总线通信协议 软件I2C 软件I2C&#xff0c;也称为模拟I2C或bit-bang I2C&#xff0c;是一种通过微控制器的通用输入输出&#xff08;GPIO&#xff09;引脚来模拟I2C总线通信的方式。它不依赖于专门的硬件I2C接口&#xff0c;而是通过编程控制GPIO引脚的电平状态来实现I…

Java启动jar设置内存分配详解

在微服务架构越来越盛行的情况下&#xff0c;我们通常一个系统都会拆成很多个小的服务&#xff0c;但是最终部署的时候又因为没有那么多服务器只能把多个服务部署在同一台服务器上&#xff0c;这个时候问题就来了&#xff0c;服务器内存不够&#xff0c;这个时候我们就需要对每…

虚拟机空间满了怎么办?

只剩143.8MB 1. 清理不必要的文件和软件 首先尝试清理系统中的不必要文件和软件&#xff0c;以释放一些空间。 清理包缓存 sudo apt-get clean sudo apt-get autoclean sudo apt-get autoremove 查找大文件 使用以下命令查找系统中的大文件&#xff0c;并删除不必要的文…

Altera的JTAG电路下载模块为何上下拉电阻,不可不知的秘密

一、FPGA背景信息 当前的FPGA市场上有国际和国产两大体系&#xff0c;国际排名&#xff0c;一直很稳定&#xff0c;国际上前三名Xilinx、Altera、Lattice&#xff0c;国内FPG厂商也在填补空白&#xff0c;低端、中低端市场上发力&#xff0c;替代潮流已在兴起&#xff0c;目前…

视频监控平台:支持交通部行业标准JT/T905协议(即:出租汽车服务管理信息系统)的源代码的函数和功能介绍及分享

目录 一、视频监控平台介绍 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;视频接入能力介绍 &#xff08;三&#xff09;功能介绍 二、JT/T905协议介绍 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;主要内容 1、设备要求 2、业务功能要求…

leetcode 130被围绕的区域

思路 一个区域不能被围绕是这个区域有部分在边界 可以循环边界&#xff0c;找边界的区域&#xff08;利用深搜&#xff09;&#xff0c;这些都不能被围绕&#xff0c;其余的&#xff0c;能被围绕&#xff0c;应该从"O"变为”X“ 代码 static boolean[][] hasGo;/…