spdlog 项目介绍与二次封装

目录

介绍

二次封装


介绍

         spdlog 是C++开源的第三方日志库,整个项目在 spdlog 命名空间中。

        在 spdlog 命名空间的 level 命名空间里定义了枚举类型,把日志分为了 5 个等级:trace  debug   info   warn  err   critical

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};

        spdlog::logger 类是基类(是整个项目其他日志类的基类)。spdlog::spdlog::async_logger 类是异步日志类。不过我们用该项目的时候不直接使用类实例化对象,而是用工厂类帮我们实例化对象。

        那么我们现在只需认识 spdlog::logger 类的几个接口即可

 //设置日志输出最低等级,参数为 spdlog::level::level_enumvoid set_level();//以什么等级输出日志,参数为要输出的内容(字符串)void trace()void debug()void info()void warn()void error()void critical()

在 spdlog 项目中,占位符用 {}

几个重要的全局接口

//输出等级设置接口
void set_level(level::level_enum log_level);
//日志刷新策略-每隔 N 秒刷新一次
void flush_every(std::chrono::seconds interval)
//日志刷新策略-触发指定等级立即刷新
void flush_on(level::level_enum log_level);

工厂类的接口就不介绍了,可以到项目源码的下面查看,作者给出了很多详细示例。工厂类的返回值为 std::shared_ptr<spdlog::logger> ,也就是智能指针指向基类,用智能指针管理日志类资源。

GitHub - gabime/spdlog: Fast C++ logging library.

二次封装

代码如下

#include <spdlog/spdlog.h>
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/async.h"
#include "spdlog/sinks/basic_file_sink.h"
#include <chrono>   //C++ 标准库namespace LOG
{std::shared_ptr<spdlog::logger> log_ptr;bool init_logger_ok = false;//mode 为 true 表示在调试模式下输出日志,trace 等级以上的日志全部输出,且输出到显示器上,否则就是在发布模式下输出日志,只会输出 level 及以上等级的日志//interval 表示多少毫秒刷新一次日志//flie_path 表示发布模式下,异步日志刷新到哪个文件里void init_logger(   bool mode = true, int interval = 1000, spdlog::level::level_enum level = spdlog::level::level_enum::trace, std::string flie_path = "test.log"){//间隔多长时间刷新一次spdlog::flush_every(std::chrono::duration<double, std::ratio<1, 1000>>(interval));//触发指定等级立即刷新spdlog::flush_on(spdlog::level::level_enum::err);spdlog::flush_on(spdlog::level::level_enum::critical);if(true == mode){//在调试模式下输出日志log_ptr = spdlog::stderr_color_mt("stdout_logger");log_ptr->set_level(level);  }else{//在运行模式下,采用异步日志的方式log_ptr = spdlog::basic_logger_mt<spdlog::async_factory>("async_logger", flie_path);log_ptr->set_level(level);}//设置输出格式log_ptr->set_pattern("%H:%M:%S [%n][%-7l]%v");init_logger_ok = true;}#define LOG_DEBUG(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->debug(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)#define LOG_INFO(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->info(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)#define LOG_WARN(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->warn(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)#define LOG_ERROR(format, ...) false == LOG::init_logger_ok ? throw "未初始化日志" : LOG::log_ptr->error(std::string("[{:>10s}:{:<4d}] ")+format, __FILE__, __LINE__, ##__VA_ARGS__)
}

        用 LOG::init_logger 初始化日志类,可以选择两种模式:

        调试模式:同步的方式输出日志,最低日志等级为 trace 。

        发布模式:异步方式输出日志,最低输出日志等级自己决定。

        std::chrono::duration<double, std::ratio<1, 1000>> 表示间隔多少个 1 / 1000 秒。

        常见的输出格式如下:

%t - 线程 IDThread ID)。
%n - 日志器名称(Logger name)。
%l - 日志级别名称(Level name),如 INFO, DEBUG, ERROR 等。
%v - 日志内容(message)。
%Y - 年(Year)。
%m - 月(Month)。
%d - 日(Day)。
%H - 小时(24-hour format)。
%M - 分钟(Minute)。
%S - 秒(Second)。

在使用时要链接两个库,makefile 如下示例

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

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

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

相关文章

shell编程之awk命令详解

1. awk 教程 1.1 调用 awk awk 是一种强大的文本处理工具&#xff0c;在 Linux 系统中广泛应用于日志分析、数据处理等场景。调用 awk 主要有以下三种方式&#xff1a; 1.1.1 命令行方式 基本语法为&#xff1a; awk (-F filed-separator) commands input-files其中&#…

服务器需要备案吗?在哪些地区需要备案?

&#x1f3af; 服务器是否需要备案&#xff1f; 是否需要备案&#xff0c;关键看以下两个因素&#xff1a; 服务器所在地&#xff08;机房位置&#xff09; 网站面向的访问群体&#xff08;境内或境外&#xff09; &#x1f3f7; 中国大陆&#xff08;境内&#xff09;服务器…

HarmonyOS学习3---ArkUI

1、组件 1.1、基础组件 1.2、布局容器 1.3、页面导航 1.4、其他组件 2、ArkTs/C混合开发&#xff0c;高性能编码 3、布局能力&交互归一 4、实时开发预览

Java学习第十五部分——MyBatis

目录 一.概述 二.特点 三.组件 四.Mapper 五.配置文件 六.使用步骤 七.高级功能 八.优点缺点 九.项目实战 1.打开idea创建一个Java项目&#xff0c;构建系统选“Maven”​ 2.创建完成后若依赖报错&#xff0c;可通过下载或重新加载来解决​ 3.配置pom.xml文件&…

小企业如何搭建本地私有云服务器,并设置内部网络地址提供互联网访问

在数字化时代&#xff0c;很多普通公司小企业规模的&#xff0c;利用本地小型服务器或计算机搭建私有云服务器&#xff0c;不仅可以提升数据管理效率&#xff0c;还能保障业务数据的安全性和灵活性。以下是为小企业量身定制的私有云服务器搭建指南&#xff0c;及最后附无公网IP…

MySQL 八股文【持续更新ing】

MySQL 八股文【持续更新ing】 文章目录 MySQL 八股文【持续更新ing】前言一、MySQL的存储引擎有哪些&#xff1f;他们之间有什么区别&#xff1f;二、MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别&#xff1f;1.InnoDB 中的聚簇索引2.InnoDB 中的非聚簇索引 三、MySQL…

每日算法刷题Day42 7.5:leetcode前缀和3道题,用时2h

7. 3026.最大好子数组和(中等,学习) 3026. 最大好子数组和 - 力扣&#xff08;LeetCode&#xff09; 思想 1.给你一个长度为 n 的数组 nums 和一个 正 整数 k 。 如果 nums 的一个子数组中&#xff0c;第一个元素和最后一个元素 差的绝对值恰好 为 k &#xff0c;我们称这个…

Linux操作系统之文件(四):文件系统(上)

前言&#xff1a; 我们前几篇文章讲了缓冲区与重定向的有关概念&#xff0c;这些设计是linux系统的核心机制&#xff0c;对系统性能、资源管理和用户操作灵活性有重要意义。 不涉及一些硬件就不可能让大家清楚地去理解文件系统&#xff0c;所以这篇文章&#xff0c;我将会从计…

java中,stream的filter和list的removeIf筛选速度比较

在 Java 里&#xff0c;Stream 的filter和 List 的removeIf筛选效率要依据具体情形来判断。 1. 操作本质有别 Stream 的 filter&#xff1a; 它是一种中间操作&#xff0c;不会立刻执行&#xff0c;而是把筛选条件记录下来。只有遇到终端操作时&#xff0c;才会开始处理元素。…

Python(28)Python循环语句指南:从语法糖到CPython字节码的底层探秘

目录 引言一、推导式家族全解析1.1 基础语法对比1.2 性能对比测试 二、CPython实现揭秘2.1 字节码层面的秘密2.2 临时变量机制 三、高级特性实现3.1 嵌套推导式优化3.2 条件表达式处理 四、性能优化指南4.1 内存使用对比4.2 执行时间优化技巧 五、最佳实践建议六、总结&#x1…

深度分析:Microsoft .NET Framework System.Random 的 C++ 复刻实现

深度分析&#xff1a;Microsoft .NET Framework Random 的 C 复刻实现 核心原理与算法结构 本实现基于 Knuth 减随机数生成器&#xff08;Subtractive Random Number Generator&#xff09;&#xff0c;是 .NET Framework 中 System.Random 的精确复刻。其核心特点包括&#x…

[论文阅读] 人工智能 | 在非CUDA硬件上运行几何学习:基于Intel Gaudi-v2 HPU的PyTorch框架移植实践

在非CUDA硬件上运行几何学习&#xff1a;基于Intel Gaudi-v2 HPU的PyTorch框架移植实践 论文标题&#xff1a;PyTorch-based Geometric Learning with Non-CUDA Processing Units: Experiences from Intel Gaudi-v2 HPUs arXiv:2507.01031 (cross-list from cs.LG) PyTorch-ba…

Python-多线程-threading

1 需求 2 接口 3 示例 4 参考资料 Python treading 模块 | 菜鸟教程

2025年- H91-Lc199-- 62.不同路径(多维动态规划)--Java版

1.题目描述 2.思路 dp含义&#xff1a;代表到当前位置的路径数 递推公式&#xff1a;dp[i][j]dp[i-1][j]dp[i][j-1] dp数组初始化&#xff0c;我们要确保第一行和第一列是有值的. dp数组的遍历顺序&#xff1a;我们需要从左往右遍历&#xff0c;从上往下遍历。并且把第一行和第…

char 不是 Java 中的 2 字节(16 位)吗? 为什么用 UTF-8 编码写入时,一个中文要占 3 个字节?

char 不是 Java 中的 2 字节&#xff08;16 位&#xff09;吗&#xff1f; 为什么用 UTF-8 编码写入时&#xff0c;一个中文要占 3 个字节&#xff1f; ✅ 一、Java 中的 char 是什么&#xff1f; Java 的 char 是一个 固定大小的 2 字节&#xff08;16 位&#xff09;类型&am…

【Elasticsearch】检索排序 分页

检索排序 & 分页 1.测试数据准备2.排序功能2.1 简单字段排序2.2 多字段排序2.3 日期排序 3.分页功能3.1 基础分页3.2 深度分页&#xff08;不推荐大数据量使用&#xff09;3.3 使用 search_after 进行高效分页 4.综合示例&#xff1a;高亮排序分页5.实践建议 1.测试数据准备…

Delta、Jackknife、Bootstrap

用班级平均身高的案例&#xff0c;展示 ​Delta、Jackknife、Bootstrap​ 的完整计算过程。 ​0. 数据准备​ ​原始数据&#xff08;4个学生的身高&#xff09;​​&#xff1a; 真实均值&#xff08;目标统计量&#xff09;​​&#xff1a; ​1. Delta 方法&#xff08;公式…

企业智脑技术架构设计:紧贴企业场景规划面向未来的发展趋势与实现路径

摘要 本文深入探讨了企业智脑技术架构的设计理念与发展趋势&#xff0c;分析了当前企业智能化转型的技术需求与挑战&#xff0c;提出了一个面向未来的企业智脑技术架构设计方案。文章从底层技术支撑、核心能力构建、应用场景适配、安全合规保障以及未来发展路径五个维度展开论…

新手向:Python方向讲解

从NASA火星任务到TikTok推荐算法&#xff0c;从自动化脚本到量子计算&#xff0c;Python用import antigravity重新定义了编程边界 一、设计哲学&#xff1a;优雅明确的编程禅学 Python之禅&#xff08;import this&#xff09;&#xff1a; 优美胜于丑陋&#xff08;Beautifu…

Chrome谷歌浏览器插件ModHeader,修改请求头,开发神器

文章目录一、介绍与下载二、使用一、介绍与下载 ModHeader顾名思义就是让我们可以自定义HTTP请求头或者是重写响应头&#xff0c;包括新增请求头/响应头或者覆盖Chrome浏览器设置的请求头的默认值&#xff0c;同时还可以根据URL Pattern来只对特定网站生效。 有条件的同学可以…