spdlog 简介与基础示例

0. 概况

0.1 源码搭建环境

源码网址:

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

可以只是用头文件,也可以先编译后使用;后面的示例都是直接使用头文件的方式。

编译方法:

$ git clone https://github.com/gabime/spdlog.git
$ cd spdlog && mkdir build && cd build
$ cmake .. && make -j

0.2 一些情况

spdlog 的 6 个log等级,定义在 spdlog/include/spdlog/common.h 中,如下;
平时打开的是 INFO,小于INFO等级的log将不被记录,这起到了filter的作用。


#define SPDLOG_LEVEL_TRACE 0
#define SPDLOG_LEVEL_DEBUG 1
#define SPDLOG_LEVEL_INFO 2
#define SPDLOG_LEVEL_WARN 3
#define SPDLOG_LEVEL_ERROR 4
#define SPDLOG_LEVEL_CRITICAL 5
#define SPDLOG_LEVEL_OFF 6


通过SPDLOG_ACTIVE_LEVEL这个宏来打开默认log等级:
#if !defined(SPDLOG_ACTIVE_LEVEL)
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO
#endif


可以通过调用函数
#include "spdlog/spdlog.h"
spdlog::set_level(spdlog::level::debug);


来将log等级降低到SPDLOG_LEVEL_DEBUG
因为有这样的定义:


enum level_enum
{
    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
};


1. 第一个示例

这是最基础的使用,打印在显示器上

test.cpp

#include "spdlog/spdlog.h"int main() 
{//如下方式是直接打印到屏幕上的log信息spdlog::info("Welcome to spdlog!");spdlog::error("Some error message with arg: {}", 1);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("{:<30}", "left aligned");spdlog::set_level(spdlog::level::debug); // Set global log level to debugspdlog::debug("This message should be displayed..");    // change log patternspdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");// Compile time log levels// define SPDLOG_ACTIVE_LEVEL to desired levelSPDLOG_TRACE("Some trace message with param {}", 42);SPDLOG_DEBUG("Some debug message");
}


build:
Makefile

TARGETS = test test_stdout_stderr test_logfile example rotate_log_test daily_log_test  backtrace_log stopwatch_logall: $(TARGETS)%: %.cppg++ $< -o $@ -I../spdlog/include.PHONY:clean
clean:-rm -f $(TARGETS)


2. 第二个示例

test_logfile.cpp

#include "spdlog/sinks/basic_file_sink.h"
//#include "spdlog/spdlog.h"
#include <iostream>
//using namespacevoid basic_logfile_example()
{try {// 这句返回一个指针类型 std::shared_ptr<logger>,具体定义在 spdlog/include/spdlog/sinks/basic_file_sink.h 中auto logger = spdlog::basic_logger_mt("writer ID", "logs/basic-log.txt");//这句将使用追加的方式,向文件logs/basic-log.txt中写入信息;格式是四个字段[time][writer ID][type][message]logger->info("hello spdlog world\n {}", 3.345);logger->error("hello error log {}", 78.9);logger->critical("hello critical log {}", 12,34);//spdlog::set_level(spdlog::level::debug);//需要打开#include "spdlog/spdlog.h"logger->debug("hello debug log {}  ",11.11);//这句不会被记录,因为记录等级不到debug,除非事前设置记录log的等级logger->warn("hello warn log {}",77.77);//spdlog::get("logger")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name)");}catch (const spdlog::spdlog_ex &ex){std::cout << "Log init failed: " << ex.what() << std::endl;}
}int main()
{basic_logfile_example();return 0;
}


3. 第三个示例

rotate_log_test.cpp

#include "spdlog/sinks/rotating_file_sink.h"
void rotating_example()
{//如果log足够多,那么最多创建3个log文件,分别在文件名后缀加 log.1.txt  log.2.txt  log.3.txt,每个文件最大到5MB// Create a file rotating logger with 5 MB size max and 3 rotated filesauto max_size = 1048576 * 5;auto max_files = 3;//这句会创建一个log文件 logs/rotating_test.txtauto logger = spdlog::rotating_logger_mt("some_logger_name", "logs/rotating_test.txt", max_size, max_files);//如果一次log缓冲的数据量足够大,使用logs/rotating_test.txt的过程中,当 logs/rotating_test.txt 的文件等于5MB时,将会被首先移动(mv)成 logs/rotating_test.1.txt//如果log在logs/rotating_test.txt中再次达到5MB时,将会先把 logs/rotating_test.1.txt 移动(shell mv)成 logs/rotating_test.2.txt,再将 logs/rotating_test.txt 移动(mv)成 logs/rotating_test.1.txt//以此类推,总之直接写入的文件是logs/rotating_test.txt//下面的循环执行结束后,超过5MB,会被移动成.1.txt文件for(int i=0; i<1024*16*5;i++){logger->info("111111111");//{printf("1");}//logger->error("llo rotate errhelllllllll");}for(int i=0; i<1024*16*5;i++){logger->info("211111111");//logger->error("hello rotate errhelllllllll");}for(int i=0; i<1024*16*5;i++){//logger->info("3");logger->error("311111111");}
}int main()
{rotating_example();return 0;
}

4. 第四个示例


daily_log_test.cpp  


#include "spdlog/sinks/daily_file_sink.h"
void daily_example()
{//如果是一个常驻的程序,比如服务器守护进程,那么每天都会重现创建一个log文件,即删除以前的内容,只记录当天创建之后的log信息;// Create a daily logger - a new file is created every day at 2:30 amauto logger = spdlog::daily_logger_mt("daily_logger", "logs/daily.txt", 12, 56);logger->info("hello 01");logger->info("hello 02");
}int main()
{daily_example();return 0;}

5. 第五个示例


backtrace_log.cpp

#include "spdlog/spdlog.h"int main()
{//这个 case 是一个场景应用案例,可以这么来用,仅记录本逻辑线路的最后几条log而已,记录在内存中;在需要的时候,将其dump出来。本逻辑线路的
// Debug messages can be stored in a ring buffer instead of being logged immediately.
// This is useful to display debug logs only when needed (e.g. when an error happens).
// When needed, call dump_backtrace() to dump them to your log.spdlog::enable_backtrace(32); // Store the latest 32 messages in a buffer. 
// or my_logger->enable_backtrace(32)..for(int i = 0; i < 100; i++){spdlog::debug("Backtrace message {}", i); // not logged yet..}
// e.g. if some error happened:spdlog::dump_backtrace(); // log them now! show the last 32 messages
// or my_logger->dump_backtrace(32)..
//return 0;
}

6. 第六个示例


stopwatch_log.cpp

#include "spdlog/spdlog.h"
// Stopwatch support for spdlog
#include "spdlog/stopwatch.h"//码表,用于统计时间
void stopwatch_example()
{spdlog::stopwatch sw, sw2;spdlog::info("Elapsed {}    {}", sw, sw2);//输出的单位是秒Sspdlog::info("Elapsed {:.3}     {:.3}", sw, sw2);//重置为0,从新计时sw.reset();spdlog::info("Elapsed {:.3}     {:.3}", sw, sw2);std::this_thread::sleep_for(std::chrono::milliseconds(123));//线程休眠123msspdlog::info("Elapsed {:.3}     {:.3}", sw, sw2);//float s=0.0f;//
}int main()
{stopwatch_example();return 0;
}

7. 第七个示例

sinks_log.cpp

建立多个信息渠道,绑定到同一个logger上,对信息进行区别对待,根据不同的级别设置过滤本sink对信息的接受或拒绝;

#include "spdlog/spdlog.h"
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/basic_file_sink.h"// create a logger with 2 targets, with different log levels and formats.
// The console will show only warnings or errors, while the file will log all.
void multi_sink_example()
{auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();console_sink->set_level(spdlog::level::warn);console_sink->set_pattern("[multi_sink_example] [%^%l%$] %v");auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/multisink.txt", true);file_sink->set_level(spdlog::level::trace);spdlog::logger logger("multi_sink", {console_sink, file_sink});//如果总体重新设计,将会导致前面的单独设置失效//logger.set_level(spdlog::level::debug);//logger.warn("this should appear in both console and file");logger.info("this message should not appear in the console, only in the file");
}int main()
{multi_sink_example();return 0;
}

sinks_log的效果:

另外为了及时全部存盘,还有如下函数 flush_every()
//用来控制强制存盘的时间周期,用来防止断电丢失太多日志信息。
// periodically flush all *registered* loggers every 3 seconds:
// warning: only use if all your loggers are thread-safe ("_mt" loggers)
spdlog::flush_every(std::chrono::seconds(3));

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

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

相关文章

vscode创建python虚拟环境

一、创建虚拟环境 python -m venv vsvenv 二、激活虚拟环境 cd .\myvenv\Scripts.\Activate.ps1 如果出现下图所示&#xff1a; 1、使用管理员运行PowerShell 2、输入命令&#xff1a;Get-ExecutionPolicy 3、输入命令&#xff1a;Set-ExecutionPolicy RemoteSigned&…

嵌入式设备里,SOC与MCU的区别是什么?

今日话题&#xff0c;嵌入式设备里&#xff0c;SOC与MCU的区别是什么?MCU与SOC有着明显的区别。MCU是嵌入式微控制器&#xff0c;而SOC则是片上系统。虽然这两者看似只有一个"嵌入式系统"的区别&#xff0c;但实际上在软件和硬件方面存在显著差异。首先&#xff0c;…

StarGAN 使用指南:一个模型实现多个域的迁移

StarGAN 使用指南 网络结构多数据集训练使用指南StarGAN v2 论文地址&#xff1a;https://arxiv.org/pdf/1711.09020.pdf 我们有猫的图片集、狗的图片集和兔子的图片集。 目标是让猫的图片看起来像狗的图片&#xff0c;狗的图片看起来像兔子的图片&#xff0c;兔子的图片看起…

面试前自测题,接口自动化测试过程中怎么处理接口依赖?

面试的时候经常会被问到在接口自动化测试&#xff0c;过程中怎么处理接口依赖&#xff1f;首先我们要搞清楚什么是接口依赖。 前言 01.什么是接口依赖 接口依赖指的是&#xff0c;在接口测试的过程中一个接口的测试经常需要依赖另一个或多个接口成功请求后的返回数据。 那怎么…

Stable Diffusion WebUI训练Lora测试XYZ显示例图

方式一 1.1 选择模型放入目录 将模型放入sd项目的models\Lora\目录,尽量保持和其他模型分开。 sd中显示如下: 1.2 脚本X/Y/Zplot选择 X轴类型:提示词搜索/替换 X轴值:NUM,000001,000002, 000003, 000004, 000005, 000006, 000007, 000008, 000009, 000010 Y轴类型:提…

Mysql进阶-事务锁

前置知识-事务 事务简介 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 就比如: 张三给李四转账1000块钱&#xff0…

文件下载保存接口的创建_FastAPI

文件下载保存接口的创建 功能描述实现代码功能演示 功能描述 在网页上对数据进行下载保存处理。例如点击网页上的保存按钮&#xff0c;会把文件下载到本地。下面就是对下载保存功能的实现。 实现代码 gpt_router.get("/export_data") async def export_data():# 需…

应用在触摸开关触控屏中的电容式触摸芯片

触摸开关是一种电子开关&#xff0c;使用时轻按开关按钮即可打开开关。松开手时&#xff0c;开关断开&#xff0c;内部结构由金属弹片受力弹动断开或者由电容值&#xff0c;电阻值等电气参数改变而控制。触摸开关一般是指应用触摸感应芯片原理设计的一种墙壁开关&#xff0c;是…

nginx部署和安装-后端程序多端口访问-后端代理设置

部分补充 查看nginx是否安装http_ssl_module模块 ./nginx -V 看到有 configure arguments: --with-http_ssl_module, 则已安装。 如果没有安装&#xff1a;参考文档 nginx官网地址&#xff1a;nginx: download 这里下载nginx-1.18.0稳定版tar.gz 下载后&#xff0c;利用…

JavaScript 数组方法 reduce() 的用法

一、概述 在JavaScript中&#xff0c;reduce()方法是一个非常实用的数组方法&#xff0c;它接收一个函数作为累加器&#xff08;accumulator&#xff09;&#xff0c;数组中的每个值&#xff08;从左到右&#xff09;开始缩减&#xff0c;最终为一个值。这个方法在处理数组…

OpenTelemetry系列 - 第4篇 OpenTelemetry K8S生态

目录 一、【Helm】添加OTel Helm repo二、【Helm Chart】OTel Collector2.1 daemonset2.2 deloyment 三、【K8S Operator】OTel Operator3.1 安装OTel Operator3.2 部署OpenTelemetryCollector3.2.1 Deloyment Mode3.2.2 DeamonSet Mode3.2.3 StatefulSetMode3.2.4 Sidecar Mod…

基于SUMO和强化学习的交通优化

本文旨在解释强化学习方法如何通过 TraCl 与 SUMO 配合使用&#xff0c;以及这如何有利于城市交通管理和自动驾驶车辆的路径优化。 NSDT工具推荐&#xff1a; Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 可编程3D场景编辑器 - REV…

Node包管理工具 - nvm、npm、yarn、cnpm、pnpm

转载说明 原文地址 简介 nvm : 可以实现一台电脑&#xff0c;拥有多个版本的Node npm : node package manager 下载Node后自带的一个包管理工具 yarn : npm 的升级版&#xff0c;更优秀 cnpm : 配置下载非官方地址的依赖&#xff08;淘宝、华为、腾讯镜像&#xff09; pnpm :…

day70

今日回顾 session 中间件 auth session Cookie虽然在一定程度上解决了“保持状态”的需求&#xff0c;但是由于Cookie本身最大支持4096字节&#xff0c;以及Cookie本身保存在客户端&#xff0c;可能被拦截或窃取&#xff0c;因此就需要有一种新的东西&#xff0c;它能支持更…

辛普森距离(SD,Sampson Distance)

定义 Sampson误差是复杂性介于代数误差和几何误差之间&#xff0c;但非常近似于几何误差的一种误差。 应用 SLAM对极几何中使用到SD来筛选内点&#xff1a; 1.随机采样8对匹配点 2.8点法求解基础矩阵 ​&#xff1b; 3.奇异值约束获取基础矩阵F&#xff1b; 4.计算误差&…

通达信指标公式19:龙虎榜股票池——主力控盘度的计算方法

0.小红牛本指标&#xff0c;选股的思路说明&#xff1a;控盘度&#xff0c;又称主力控盘&#xff0c;是指主力控制了某只股票的大部分流通股&#xff0c;从而控制了股票的价格。主力控盘的目的通常是为了获取更多的收益&#xff0c;通过控制股票价格来实现其策略。所以首要分析…

(04730)电路分析基础之电阻、电容及电感元件

04730电子技术基础 语雀&#xff08;完全笔记&#xff09; 电阻元件、电感元件和电容元件的概念、伏安关系&#xff0c;以及功率分析是我们以后分析电 路的基础知识。 电阻元件 电阻及其与温度的关系 电阻 电阻元件是对电流呈现阻碍作用的耗能元件&#xff0c;例如灯泡、…

外包干了2个月,技术倒退2年。。。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

现代版“田忌赛马”:IPMT如何实现资源利用最大化

摘要&#xff1a;在流程调整和产品重整过程中&#xff0c;IPMT发挥了至关重要的作用。IPMT是什么&#xff1f;它的职责到底是什么&#xff1f;每个公司必须要有IPMT吗&#xff1f; 1992年&#xff0c;IBM在激烈的市场竞争下&#xff0c;遭遇到了严重的财政困难&#xff0c;利润…

机器学习-ROC曲线:技术解析与实战应用

本文全面探讨了ROC曲线&#xff08;Receiver Operating Characteristic Curve&#xff09;的重要性和应用&#xff0c;从其历史背景、数学基础到Python实现以及关键评价指标。文章旨在提供一个深刻而全面的视角&#xff0c;以帮助您更好地理解和应用ROC曲线在模型评估中的作用。…