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,一经查实,立即删除!

相关文章

推荐5个节省90%精力的GitHub工具库

下面五个GitHub工具库可节约你大部分时间&#xff0c;提升效率&#xff1a; 1、Trigger.dev 如果您有长时间运行的作业&#xff0c;请在应用中实现Trigger。 使用 API 集成、Webhooks、调度和延迟等功能直接在代码库中创建长时间运行的作业。 例如&#xff0c; 当用户升级他们…

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

探索医学影像:如何通过ROI灰度直方图和ROI区域方格图揭示隐秘细节?

一、引言 医学影像是现代医学诊断的重要手段&#xff0c;其中nrrd文件格式作为一种常见的医学影像数据存储方式&#xff0c;被广泛应用于各种医学影像设备和软件中。这种文件格式具有丰富的元数据信息&#xff0c;可以精确记录影像的空间位置、方向和尺度等信息&#xff0c;对于…

CentOS7安装最新版本git

CentOS7上的git是1.8.3.1&#xff0c;比较老&#xff0c;使用体验不好。下载源码来升级一下。 sudo yum -y install dh-autoreconf curl-devel expat-devel gettext-devel openssl-devel perl-devel zlib-devel sudo yum -y iinstall asciidoc xmlto docbook2X sudo yum -y in…

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

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

什么情况下要使用迷宫式油封?

在机械领域&#xff0c;选择正确的密封件可以显着影响设备的效率和寿命。一种这样的密封件是迷宫式油封。本文将探讨迷宫式油封会在哪些场景下使用。 迷宫式油封是一种非接触式密封件&#xff0c;可提供曲折的路径或“迷宫”&#xff0c;以帮助防止油等流体泄漏。与其他密封件…

【开源视频联动物联网平台】J2mod库写一个Modbus TCP 服务器

j2mod 是一个用于 Modbus 通信协议的 Java 库&#xff0c;可以用来创建 Modbus TCP 服务器。以下是一个简单的示例代码&#xff0c;演示如何使用 j2mod 创建一个 Modbus TCP 服务器。 首先&#xff0c;确保你已经添加 j2mod 库到你的项目中。你可以从 j2mod 的官方网站&#x…

HarmonyOS三方库涵盖了7大类

✍️作者简介&#xff1a;大鹏编码&#xff08;专注于HarmonyOS、Android、Java、Web、TCP/IP等技术方向&#xff09; &#x1f433;博客主页&#xff1a; 开源中国、稀土掘金、51cto博客、知乎、简书、CSDN &#x1f514;如果文章对您有一定的帮助请&#x1f449;关注✨、点赞…

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

面试的时候经常会被问到在接口自动化测试&#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;利用…

阶段四:数据分析与机器学习(学习如何使用matplotlib和seaborn进行数据可视化)

Matplotlib 和 Seaborn 是 Python 中常用的数据可视化库。Matplotlib 是一个基本的绘图库,可以用于绘制各种静态、动态、交互式和三维图表。Seaborn 基于 Matplotlib,提供了更高级的接口和更美观的默认样式。 下面是一个简单的教程,介绍如何使用 Matplotlib 和 Seaborn 进行…

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…

RocketMq原理(待完善)

MQ作用 异步解耦削峰 RocketMQ背景 ​ RocketMQ是阿里巴巴开源的一个消息中间件&#xff0c;在阿里内部历经了双十一等很多高并发场景的考验&#xff0c;能够处理亿万级别的消息。2016年开源后捐赠给Apache&#xff0c;现在是Apache的一个顶级项目。 ​ 早期阿里使用ActiveM…

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

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