当前位置: 首页 > news >正文

spdlog讲解

介绍

spdlog 是一个高性能、超快速、零配置的 C++ 日志库,它旨在提供简洁的 API 和丰富的功能,同时保持高性能的日志记录。它支持多种输出目标、格式化选项、线程安全以及异步日志记录。

安装

 sudo apt-get install libspdlog-dev 

接口讲解

对于 spdlog 的设计让我想到了之前使用的 jsoncpp 序列化和反序列化,

都是基于一个基础的类,在之后设置工厂类进行创建不同的类型

日志记录器类

创建一个日志记录器,并设置日志级别和输出模式


namespace spdlog {class logger { logger(std::string name); logger(std::string name, sink_ptr single_sink) logger(std::string name, sinks_init_list sinks) void set_level(level::level_enum log_level); void set_formatter(std::unique_ptr<formatter> f); //这是几个不同等级的打印接口template<typename... Args> void trace(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void debug(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void info(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void warn(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void error(fmt::format_string<Args...> fmt, Args &&...args) template<typename... Args> void critical(fmt::format_string<Args...> fmt, Args &&...args)//两种不同的刷新策略,这里是对指定的日志类设置刷新策略void flush(); //刷新日志 //策略刷新--触发指定等级日志的时候立即刷新日志的输出 void flush_on(level::level_enum log_level); 
}; 

异步日志器类

异步创建日志类,主要使用 spdlog::async_logger


class async_logger final : public logger
{//这里的初始化我们没必要过于关注,下面的工厂类会进行封装async_logger(std::string logger_name,sinks_init_list sinks_list,std::weak_ptr<details::thread_pool> tp,async_overflow_policy overflow_policy =async_overflow_policy::block);async_logger(std::string logger_name,sink_ptr single_sink,std::weak_ptr<details::thread_pool> tp,async_overflow_policy overflow_policy =async_overflow_policy::block);// 异步日志输出需要异步工作线程的支持,这里是线程池类class SPDLOG_API thread_pool{thread_pool(size_t q_max_items,size_t threads_n,std::function<void()> on_thread_start,std::function<void()> on_thread_stop);thread_pool(size_t q_max_items, size_t threads_n,std::function<void()> on_thread_start);thread_pool(size_t q_max_items, size_t threads_n);};
}//默认线程池的初始化接口 
inline void init_thread_pool(size_t q_size, size_t thread_count)

日志记录器工厂

类的创建接口,


using async_factory =async_factory_impl<async_overflow_policy::block>;template <typename Sink, typename... SinkArgs>
inline std::shared_ptr<spdlog::logger> create_async(std::string logger_name,SinkArgs &&...sink_args)--------------------------------------------------------------------------------// 创建一个彩色输出到标准输出的日志记录器,默认工厂创建同步日志记录器template <typename Factory = spdlog::synchronous_factory>std::shared_ptr<logger> stdout_color_mt(const std::string &logger_name,color_mode mode = color_mode::automatic);-----------------------------------------------------------------------------------// 指定文件
template <typename Factory = spdlog::synchronous_factory>
std::shared_ptr<logger> basic_logger_mt(const std::string &logger_name,const filename_t &filename,bool truncate = false,const file_event_handlers &event_handlers = {})------------------------------------------------------------------------------------//默认是同步日志类,当我们想要换为异步日志类时就将<logger>换为<spd::async_logger>

日志类格式设置

相关函数
spdlog::set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%L%$] [%t] %v");

占位符

含义

示例输出

%Y

4 位年

2025

%m

2 位月

10

%d

2 位日

09

%H

24 小时

23

%M

分钟

59

%S

48

%n

logger 名称

"net"

%l

级别全称

INFO

%v

实际消息文本

"connection timeout"

%@

文件名:行号

server.cpp:127

代码演示

同步日志类

#include<spdlog/spdlog.h>
#include<iostream>//注意不要忘了头文件
#include <spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>int main()
{//设置全局刷新策略spdlog::flush_every(std::chrono::seconds(1));spdlog::flush_on(spdlog::level::level_enum::debug);//设置全局的日志输出等级spdlog::set_level(spdlog::level::level_enum::debug);//创建同步日志器//auto logger=spdlog::stdout_color_mt("default-logger");auto logger=spdlog::basic_logger_mt("file_logger","sync.log");//设置日志器的刷新策略和等级// logger->flush_on(spdlog::level::level_enum::debug);// logger->set_level(spdlog::level::level_enum::debug);//设置日志器的输出格式logger->set_pattern("[%H:%M:%S][%t][%-8l] %v");//spdlog的输出占位符号是{}logger->trace("你好,{}","xiaowang");logger->debug("你好 {}","xiaownag");logger->error("你好 {}","xiaownag");return 0;
}

异步日志类

#include<spdlog/spdlog.h>
#include<iostream>//注意不要忘了头文件
#include <spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>
#include<spdlog/async.h>int main()
{//设置全局刷新策略spdlog::flush_every(std::chrono::seconds(1));spdlog::flush_on(spdlog::level::level_enum::debug);//设置全局的日志输出等级spdlog::set_level(spdlog::level::level_enum::debug);//观察这里spdlog::async_factory的变化auto logger=spdlog::basic_logger_mt<spdlog::async_factory>("file_logger","async.log");//设置日志器的输出格式logger->set_pattern("[%H:%M:%S][%t][%-8l] %v");//spdlog的输出占位符号是{}logger->trace("你好,{}","xiaowang");logger->debug("你好 {}","xiaownag");logger->error("你好 {}","xiaownag");return 0;
}

http://www.dtcms.com/a/474565.html

相关文章:

  • 怎样用vps做网站超级优化
  • 下载接口返回的数据流格式文件
  • 关于网站建设的合同范本正规太原软件开发公司有哪些
  • Python反射机制通俗详解(新手友好版)
  • 网站开发要源码多少钱wordpress 静态资源加速
  • 【多线程】阻塞等待(Blocking Wait)(以Java为例)
  • 公众号做 视频网站商品行情软件下载
  • Kubernetes环境下Nginx代理Nacos服务请求故障诊断
  • Linux 文件权限详解与实操命令
  • 1Docker镜像与容器,目录挂载和卷映射的选择
  • 06_k8s数据持久化
  • c 教学网站开发网页设计尺寸大小规范
  • 第一章:AI大模型基本原理及API应用——第一小节
  • 购物便宜的网站有哪些vivo即将发布的新手机
  • 超级玛丽demo9
  • 汕头站扩建什么时候完成做单屏网站 高度是多少
  • 【Swift】LeetCode 1. 两数之和
  • CI/CD流水线实战:从零搭建到高效部署
  • AprioriFP-Growth算法详解
  • 吕梁网站定制wordpress登录注册页面模板
  • 网站列表页是啥求个网站这么难吗2021年
  • wordpress如何制作网站做影片的网站描述
  • Java Redis “高可用 — 主从复制”面试清单(含超通俗生活案例与深度理解)
  • etcd实战课-实战篇(下)
  • 定制一个网站多少钱企业做网站有用吗天涯
  • 05-k8s网络
  • Stable Diffusion 安装教程(详细)_stable diffusion安装
  • 做网站的dw全称是啥免费软件视频
  • 开源TTS项目 Neutts-Air:架构、训练、推理与应用全景
  • python--手势识别