spdlog框架的安装与使用

spdlog框架的安装与使用

  • spdlog的安装
  • spdlog的使用
  • spdlog二次封装
  • 总结:

spdlog的安装

sudo apt-get install libspdlog-dev

spdlog的使用

同步日志器sync.cc
(输出到显示器/输出到指定文件)

#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<iostream>int main()
{//设置全局的刷新策略,每秒刷新一次spdlog::flush_every(std::chrono::seconds(1));//遇到debug以上级别的日志立刻刷新spdlog::flush_on(spdlog::level::level_enum::debug);//设置全局的日志输出等级spdlog::set_level(spdlog::level::level_enum::debug);//创建同步日志器(模板默认是同步工厂,不需要写,标准输出,输出到显示器上)//auto logger=spdlog::stdout_color_mt("defaut-logger");//创建同步日志器(文件输出,输出到文件上)auto logger=spdlog::basic_logger_mt("file-logger","sync_file.log");//设置日志器的刷新策略,以及输出等级,但是已经有了全局的就可以不用局部的// logger->flush_on(spdlog::level::level_enum::debug);// logger->set_level(spdlog::level::level_enum::debug);//设置日志的输出格式、logger->set_pattern("[%H:%M:%S][%t][%n][%-8l] %v");//进行简单的日志输出logger->trace("你好!{}","陶恩威");logger->debug("你好!{}","陶恩威");logger->info("你好!{}","陶恩威");logger->warn("你好!{}","陶恩威");logger->error("你好!{}","陶恩威");logger->critical("你好!{}","陶恩威");std::cout<<"日志输出完毕\n";return 0;
}

makefile:

sync:sync.ccg++ -std=c++17 $^ -o $@ -lspdlog -lpthread

异步日志器:async.cc
(输出到显示器/输出到指定文件)

#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>
#include<iostream>
//异步日志器跟同步日志器的使用没有区别,只不过在创建时,需要使用异步工厂日志器模板
int main()
{//设置全局的刷新策略,每秒刷新一次spdlog::flush_every(std::chrono::seconds(1));//遇到debug以上级别的日志立刻刷新spdlog::flush_on(spdlog::level::level_enum::debug);//设置全局的日志输出等级spdlog::set_level(spdlog::level::level_enum::debug);//创建异步日志器(模板默认是同步工厂,创建异步就需要指定异步工厂,标准输出,输出到显示器上),会将后面的先输出//而原本的日志输出后输出,因为日志先放入了内存中,由线程池输出//auto logger=spdlog::stdout_color_mt<spdlog::async_factory>("defaut-logger");//异步日志器,文件输出auto logger=spdlog::basic_logger_mt<spdlog::async_factory>("file-logger","async_file.log");//设置日志的输出格式、logger->set_pattern("[%H:%M:%S][%t][%n][%-8l] %v");//进行简单的日志输出logger->trace("你好!{}","陶恩威");logger->debug("你好!{}","陶恩威");logger->info("你好!{}","陶恩威");logger->warn("你好!{}","陶恩威");logger->error("你好!{}","陶恩威");logger->critical("你好!{}","陶恩威");std::cout<<"日志输出完毕\n";return 0;
}

makefile:

async:async.ccg++ -std=c++17 $^ -o $@ -lspdlog -lpthread

spdlog二次封装

spdlog日志输出没有文件名和行号,而一般项目中都要有对应的文件名以及行号,所以原本的spdlog就不好用,所以要封装一下,让其能够打印行号与文件名。

要对日志的初始化接口进行封装
要对日志的输出接口进行封装

logger.hpp

//对日志器进行二次封装
//1.因为原来的日志格式中没有文件名和行号,所以要进行封装
//2.为了便于操作,通过命令行参数来决定创建日志器输出在哪里:
/*如果是debug模式则输出到标准输出中.如果是发布模式则输出到文件中*/#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>
//初始化日志器,有三个参数
//1.mode 表示运行的模式,true代表是发布模式,false代表是dubug模式
//2.file 表示如果是发布模式,日志输出的文件名叫什么,在debug模式下为空
//3.level 发布模式下,输出的日志等级是什么,在debug模式下为0.
std::shared_ptr<spdlog::logger> default_logger;
void init_logger(bool mode,const std::string&file,uint32_t level)
{if(mode==false){//调试debug模式下,则创建标准输出日志器,日志器的等级最低为0,刷新策略也是最低default_logger=spdlog::stdout_color_mt("defaut-logger");default_logger->set_level(spdlog::level::level_enum::trace);default_logger->flush_on(spdlog::level::level_enum::trace);}else{//发布模式下,则创建文件输出日志器,日志器的等级为level,刷新策略也是leveldefault_logger=spdlog::basic_logger_mt("file-logger",file);default_logger->set_level((spdlog::level::level_enum)level);default_logger->flush_on((spdlog::level::level_enum)level);}//创建完日志器之后,就要设置日志器的输出格式default_logger->set_pattern("[%H:%M:%S][%t][%n][%-8l]%v");
}//日志器初始化完后,就要对日志器的输出进行封装,因为日志器的输出格式中没有文件名和行号,利用宏定义来修改
#define TRACE_LOG(format,...) default_logger->trace(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define DEBUG_LOG(format,...) default_logger->debug(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define INFO_LOG(format,...) default_logger->info(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define ERROR_LOG(format,...) default_logger->error(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);
#define FATAL_LOG(format,...) default_logger->critical(std::string("[{}:{}]")+format,__FILE__,__LINE__,##__VA_ARGS__);

使用样例:
mian.cc


#include "logger.hpp"
#include <gflags/gflags.h>
#include<iostream>
//想通过命令行参数调整变量的内容,所以通过gflags框架捕捉命令行参数数据放入到自己定义的全局变量中
DEFINE_bool(run_mode,false,"表示程序的运行模式,默认是false调试默认,true表示发布模式");
DEFINE_string(file,"","表示发布模式下要输出的文件名称,默认调试模式下为空");
DEFINE_int32(level,0,"表示发布模式下日志器输出的等级,默认调试模式下为0");int main(int argc,char*argv[])
{//首先初始化gflags框架,告诉它要捕捉命令行中的参数数据google::ParseCommandLineFlags(&argc, &argv, true);//初始化spdlog日志器;init_logger(FLAGS_run_mode,FLAGS_file,FLAGS_level); //日志输出TRACE_LOG("你好呀 {}","陶恩威");DEBUG_LOG("你好呀 {}","陶恩威");INFO_LOG("你好呀 {}","陶恩威");ERROR_LOG("你好呀 {}","陶恩威");FATAL_LOG("你好呀 {}","陶恩威");return 0;
}

makefile:

main:main.ccg++ -std=c++17 $^ -o $@ -lspdlog -lpthread -lgflags

总结:

spdlog日志库封装与使用
本文介绍了spdlog日志库的安装、基本使用和二次封装方法。主要内容包括:
spdlog安装:通过apt-get install libspdlog-dev命令安装
基本使用:
同步日志器:支持输出到显示器或文件
异步日志器:使用线程池提高性能

二次封装:
封装了日志初始化接口,支持通过命令行参数控制日志输出模式(debug/发布)
封装了日志输出宏,添加了文件名和行号信息
使用gflags框架处理命令行参数

示例代码展示了如何初始化日志器和输出不同级别的日志信息

封装后的日志库更方便在项目中使用,能够自动记录文件名和行号,并通过命令行参数灵活控制日志行为。

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

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

相关文章

使用websockets中的一些问题和解决方法

&#xff08;1&#xff09;TypeError: echo() missing 1 required positional argument: path报错自己写的代码如下&#xff1a;async def echo(websocket, path):...async def main():server await websockets.serve(echo, "0.0.0.0", 666)await server.wait_close…

机器人相关基础知识

机器人简介下面给出一份机器人方向“从入门到进阶”的极简知识地图&#xff0c;按「数学 → 硬件 → 软件 → 算法 → 应用」五层展开&#xff0c;配合常用开源资源。你可以把它当作“字典”随时查阅。&#x1f539; 1. 数学层&#xff08;所有算法的地基&#xff09;概念一句话…

Windows Server 打开vGPU RDP HEVC编码

查看已安装的驱动[rootlocalhost:~] esxcli software vib list Name Version Vendor Acceptance Level Install Date Platforms ----------------------------- ------------------------------------ ------ -…

OpenAL技术详解:跨平台3D音频API的设计与实践

引言&#xff1a;OpenAL的定位与价值 OpenAL&#xff08;Open Audio Library&#xff09; 是一套跨平台的3D音频应用程序接口&#xff08;API&#xff09;&#xff0c;专为高效渲染多通道三维定位音频而设计。其API风格与编程范式刻意模仿OpenGL&#xff0c;旨在为游戏开发、虚…

重温 K8s 基础概念知识系列五(存储、配置、安全和策略)

文章目录一、存储&#xff08;Storage&#xff09;1.1、Volume1.2、PersistentVolume (PV)1.3、PersistentVolumeClaim (PVC)1.4、StorageClass1.5、PVC 和 PV 的绑定过程&#xff1f;二、配置管理&#xff08;Configuration&#xff09;2.1、ConfigMap2.2、Secret2.3、存活、就…

通过PhotoShop将多张图片整合为gif动画

一、准备图片集合二、导入PS导入PS后点击确定&#xff1a;导入成功&#xff1a;三、添加时间轴勾选创建帧动画&#xff1a;此时时间轴进化为帧动画轴&#xff1a;四、图片集部署在帧动画轴点击帧动画轴右上角的三道横杠&#xff0c;从图层建立帧&#xff1a;此时图片集已经部署…

Easy Rules 规则引擎详解

Easy Rules 规则引擎详解 Easy Rules 是一个轻量级的 Java 规则引擎&#xff0c;它提供了一种简单而强大的方式来定义和执行业务规则。以下是 Easy Rules 的详细介绍&#xff1a; 1. 核心概念 1.1 规则 (Rule) 条件 (Condition): 当条件为 true 时执行动作动作 (Action): 条件满…

优雅设计:打造AI时代的高效后端API接口——领码课堂深度解析

&#x1f4cc; 摘要 后端API接口已经成为软件架构的神经系统。微服务演化、AI渗透、自动化治理……这些趋势迫使我们重新定义接口设计的标准。本文从统一规范、参数校验、异常处理、性能优化四大维度出发&#xff0c;结合领码Spark的接口治理平台与AI赋能实践&#xff0c;构建一…

【VUE】用EmailJS自动发送邮件到网易邮箱

1.注册 EmailJS 账号​​&#xff1a;访问 EmailJS 官网并注册2.添加电子邮件服务​​&#xff1a;在 Dashboard 中点击 "Add New Service"选择 SMTP server填写 SMTP 服务器信息SMTP Host: smtphz.qiye.163.com (网易企业邮箱)SMTP Port: 994 (SSL)User: 你的邮箱Ap…

Ubuntu下载、安装、编译指定版本python

下载 Index of /ftp/python/ https://www.python.org/downloads/ 删除旧的python sudo apt autoremove python sudo apt autoremove python3 安装依赖 sudo apt-get install -y zlib1g-dev libbz2-dev libssl-dev libncurses5-dev \ libsqlite3-dev libreadline-dev tk-d…

如何新建一个自己的虚拟环境

在今天我换了个电脑跑模型的时候&#xff0c;出现了一个问题&#xff1a;C:\ProgramData\Anaconda3\python.exe H:/ywp/project/model/msi_caijian.py Traceback (most recent call last):File "H:/ywp/project/model/msi_caijian.py", line 2, in <module>imp…

(第十八期)图像标签的三个常用属性:width、height、border

&#xff08;第十八期&#xff09;图像标签的三个常用属性&#xff1a;width、height、border 在网页开发中&#xff0c;控制图片尺寸与样式是基础又高频的操作。本文围绕 img 图像标签的三个属性展开&#xff1a;width&#xff08;宽度&#xff09;、height&#xff08;高度&a…

Windows桌面自动化的革命性突破:深度解析Windows-MCP.Net Desktop模块的技术奥秘

"在数字化浪潮中&#xff0c;桌面自动化不再是程序员的专利&#xff0c;而是每个人都能掌握的超能力。" —— 当我第一次接触到Windows-MCP.Net的Desktop模块时&#xff0c;这样的感慨油然而生。 &#x1f3af; 引言&#xff1a;为什么桌面自动化如此重要&#xff1f…

免费又强大的 PDF 编辑器 ——PDF XChange Editor

在日常的学习和工作中&#xff0c;我们经常会与 PDF 文档打交道&#xff0c;然而&#xff0c;PDF 文档的编辑却常常让人抓狂。比如拿到一份 PDF 合同或报告&#xff0c;发现里面有错别字或者需要更新数据&#xff1b;又或者遇到需要填写的 PDF 表单&#xff0c;只能打印出来手写…

Unity引擎播放HLS自适应码率流媒体视频

大家好&#xff0c;我是阿赵。今天来学习一下Unity引擎怎样播放自适应码率视频的方法。 一、 HLS是什么HLS是什么&#xff0c;各位可以自己百度一下。简单的概括&#xff0c;HLS是一种自适应码率流媒体传输协议&#xff0c;实现的是分片下载和动态码率切换。它的原理是把一段视…

Flink 源码系列 - 前言

Flink 源码系列 - 前言 &#x1f680; 为什么要学习 Flink 源码&#xff1f; Apache Flink 作为当前最流行的流式计算框架之一&#xff0c;其源码体系极其庞大。根据统计&#xff0c;Flink 项目包含&#xff1a; Java 文件总行数&#xff1a;232万行有效代码行数&#xff1a…

Rust:实现仅通过索引(序数)导出 DLL 函数的功能

在 Rust 中&#xff0c;可以通过手动控制导出来实现仅通过索引&#xff08;序数&#xff09;导出 DLL 函数的功能。以下是具体方法和完整步骤&#xff1a;解决方案 通过结合 .def 文件&#xff08;模块定义文件&#xff09;和 MSVC 链接器参数来实现函数名隐藏&#xff0c;只暴…

部分网站记录

Gradle多渠道打包[umeng] https://www.jianshu.com/p/8b8fdd37bf26 介绍在app的build.gradle设置produceFlavors&#xff0c;一键打包所有环境的命令 Android 知识图谱 https://upload-images.jianshu.io/upload_images/19956127-1b214e26967dacc6.jpg 百度的语音识别 https:…

【速通】深度学习模型调试系统化方法论:从问题定位到性能优化

深度学习模型调试的系统化方法论&#xff1a;从问题定位到性能优化 文章目录深度学习模型调试的系统化方法论&#xff1a;从问题定位到性能优化摘要1. 引言2. 模型调试的层次化框架2.1 三层调试架构2.2 调试优先级原则3. 系统化调试流程3.1 快速诊断清单3.2 最小可复现案例 (MR…

Nacos-6--Naco的QUIC协议实现高可用的工作原理

QUIC&#xff08;Quick UDP Internet Connections&#xff09;是一种基于UDP的传输层协议&#xff0c;旨在减少网络延迟、提升安全性并优化多路复用能力。它由Google开发&#xff0c;后被IETF标准化为HTTP/3的底层协议。 1、QUIC是什么&#xff1f; QUIC&#xff08;Quick UDP …