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

昆明网站营销东莞网站建设 兼职

昆明网站营销,东莞网站建设 兼职,网站推广原则,wordpress建站事项C/C 文章目录 C/C前言2、控制台打印日志3、保存日志文件4、自定义日志记录器5、多记录器共享文件6、日志分割7、定时日志8、记录器包含多个 sink9、其他介绍 前言 Spdlog是一个快速、异步、线程安全的C日志库,他可以方便地记录应用程序的运行状态,并提供…

C/C++


文章目录

  • C/C++
  • 前言
    • 2、控制台打印日志
    • 3、保存日志文件
    • 4、自定义日志记录器
    • 5、多记录器共享文件
    • 6、日志分割
    • 7、定时日志
    • 8、记录器包含多个 sink
    • 9、其他介绍


前言

Spdlog是一个快速、异步、线程安全的C++日志库,他可以方便地记录应用程序的运行状态,并提供多种输出格式。官网:https://github.com/gabime/spdlog

安装教程可以参考:https://blog.csdn.net/Harrytsz/article/details/144887297

Spdlog的优点:

只包含头文件
速度很快
无需依赖第三方库
支持跨平台
支持多线程—线程安全
可对日志文件进行循环输出
可每日生成日志文件
可支持控制台日志输出
可选的异步输出
可定义日志格式
1、日志级别
trace = SPDLOG_LEVEL_TRACE // 最低级(用来记录代码执行轨迹)
debug = SPDLOG_LEVEL_DEBUG // (用来记录debug信息)
info = SPDLOG_LEVEL_INFO // 在上面的测试例子中用过
warn = SPDLOG_LEVEL_WARN
err = SPDLOG_LEVEL_ERROR
critical = SPDLOG_LEVEL_CRITICAL
off = SPDLOG_LEVEL_OFF // 最高级

2、控制台打印日志

方式一,最简单的使用方式,将日志输出到控制台。

#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>void stdout_easy()
{// 根据参数,在内部创建了一个名为 "console" 的 logger,返回 logger 的智能指针。auto console = spdlog::stdout_color_mt("console");// 通过智能指针调用 logger 对象的函数。console->info("hello world");
}
int main()
{stdout_easy();return 0;
}

输出结果:

方式二,

#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>void stdout_example() {// create a color multi-threaded logger// spdlog::stdout_color_mt("console")函数创建一个名字为console的console logger,// 把这个 logger 注册到 spdlog 的全局注册表中,并且返回指向这个 logger 的指针(shared_ptr)auto console_stdout = spdlog::stdout_color_mt("console");// 如果我们不知道上方创建函数返回的指针,我们也可以直接通过 logger 名称来获取对应 logger // 通过 get 来获取已经创建好的 logger,获取方式通过指针名,同时使用 info 函数输出日志内容spdlog::get("console")->info("loggers can be retrieved from a global registry using the spdlog::get(logger_name)");
}int main() {stdout_example();return 0;
}

输出结果:

3、保存日志文件

下面的案例将日志记录保存到文件中,以便于长久保存。basic_logger_mt 只是 spdlog 中封装的其中一个日志记录器,还有很多其他的记录器。

#include<iostream>
#include<spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>int main() {// 创建一个名为 basic_logger 的日志记录器,并且返回指针。// mt 表示多线程,意味着多个线程中使用同一个日志记录器。// 需要注意的是在文件内添加数据是通过追加的形式进行的,并且如果没有创建文件会自动创建文件。auto basic_logger = spdlog::basic_logger_mt("basic_logger", "./logs/basic_log.txt");for (int i = 0; i < 10000; i++) {basic_logger->info("Test file logger{}", i);}return 0;
}

4、自定义日志记录器

我们根据以上的学习之后,大体了解了其中的运行机制,所以我们就可以不使用他封装的日志记录器,而是使用他内部的 logger 对象封装适合自己的日志记录器。

需要注意的是,所谓的不同的日志记录器其实就是不同的 logger 对象,那么用什么来区分不同的 logger 对象呢,就是用创建logger对象时传入的参数 sink 对象,这个sink对象标记着不同的类型,把他作为参数 logger 会根据 sink 对象类型的不同创建不同的日志记录器。

这种方式有很大的用途,比如我们可以创建一个日志记录器,但是里边有多个类型的 sink,从而可以一个 logger 能够实现多种效果。

#include<iostream>
#include<spdlog/spdlog.h>
//#include <spdlog/sinks/stdout_sinks.h>
#include <spdlog/sinks/stdout_color_sinks.h>void make_console_spdlog() {/*auto console_level = std::make_shared<spdlog::sinks::stdout_sink_mt>();*/    // 黑白日志auto console_level = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();  // 彩色日志auto console = std::make_shared<spdlog::logger>("console", console_level);console->info("hello world");
}int main() {make_console_spdlog();return 0;
}

输出结果:

注意:通过手动创建的日志记录器是无法通过名字在 spdlog 中进行查找的,因为他并没有注册到 spdlog 的全局注册表。

void make_console_spdlog() {auto console_level = std::make_shared<spdlog::sinks::stdout_sink_mt>();auto console = std::make_shared<spdlog::logger>("console", console_level);// 直接使用这种方式去获取日志记录器发生错误spdlog::get("console")->info("hello world!");
}

所以在创建日志记录器完成后,要将其注册到spdlog的全局注册表中。

#include<iostream>
#include<spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>void make_console_spdlog() {auto console_level = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();auto console = std::make_shared<spdlog::logger>("console", console_level);// 将创建的日志记录器注册到全局注册表中spdlog::register_logger(console);spdlog::get("console")->info("hello world!");
}int main() {make_console_spdlog();return 0;
}

5、多记录器共享文件

#include <iostream>
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>void multi_file_write()
{// 创建filesink,以便多个日志共享器共享。auto filesink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("./logs/multilogger.txt");// 创建两个日志记录器来进行测试auto onelogger = std::make_shared<spdlog::logger>("onelogger", filesink);auto twologger = std::make_shared<spdlog::logger>("twologger", filesink);// 注册进spdlog的全局注册表spdlog::register_logger(onelogger);spdlog::register_logger(twologger);for (int i = 0; i < 100; i++) {onelogger->info("onelogger write:{}", i);twologger->info("twologger write:{}", i);}
}int main() {multi_file_write();return 0;
}

6、日志分割

在我们的应用程序有很多日志需要记录时,每个日志文件就会变得非常大,这样就会影响应用程序的性能以及稳定性。所以为了解决这个问题,可以使用Spdlog的日志分割功能。

rotating log 滚动日志,当日志文件超出规定大小时,会删除当前日志文件中所有内容,重新开始写入

#include<iostream>
#include<spdlog/spdlog.h>
#include <spdlog/sinks/rotating_file_sink.h>void rotaing_file() {// 首先定义要使用分割文件的大小和数量int max_size = 1048576 * 5;int file_size = 3;// 创建 rotaing_logger_mt 日志记录器auto rotaing_file = spdlog::rotating_logger_mt("rotaing_file", "./logs/rotaingLogger.txt", max_size, file_size);for (int i = 0; i < 100000; i++) {rotaing_file->info("rotaing file:{}", i);}
}int main() {rotaing_file();return 0;
}

7、定时日志

Spdlog还可以实现定时创建文件存储日志的功能。

#include<iostream>
#include<spdlog/spdlog.h>
#include <spdlog/sinks/daily_file_sink.h>void daily_log() {// 创建daily_log日志// 参数介绍 1日志记录器名称 2文件名 3时 4分auto daily_log = spdlog::daily_logger_mt("daily_log", "./logs/daily_log.txt", 16, 18);for (int i = 0; i < 100000; i++) {daily_log->info("daily log print {}", i);}
}int main() {daily_log();return 0;
}

8、记录器包含多个 sink

#include<iostream>
#include<spdlog/spdlog.h>
#include<spdlog/sinks/stdout_color_sinks.h>
#include<spdlog/sinks/basic_file_sink.h>void multi_sink() {// 创建两个sink,一个用于控制台输出,一个用于文件输出auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("./logs/multi_sink.txt");// 设置两者输出等级console_sink->set_level(spdlog::level::info);file_sink->set_level(spdlog::level::debug);// 将两种不同的sink放到一个日志输出器中auto multi_sink = std::make_shared<spdlog::logger>("multi_sink", spdlog::sinks_init_list({ console_sink, file_sink }));multi_sink->set_level(spdlog::level::debug);// 输出不同等级日志测试multi_sink->info("hello world info");multi_sink->debug("hello world debug");
}int main() {multi_sink();return 0;
}

9、其他介绍

通过上面的学习,我们学会了 spdlog 其函数的基本使用方式,下面对 spdlog 中常用的一些函数和类进行介绍。

level_enum:日志等级枚举,包括trace、info、debug、warn、err、critical、off、n_levels。
sink:日志记录槽,进行底层操作(比如格式化内容,输出内容到控制台/文件)的类。spdlog自带的几种sinks已经能满足日常需求,也可以派生其基类设计新的 sink 以满足特殊的需求。sink类主要使用的函数包括:
set_pattern(const std::string&):设置日志输出格式。
set_level(level_enum):设置日志输出的最低等级。
log(log_msg):由logger自动调用,外部不会主动调用。
logger:日志记录器,被顶层调用来输出日志的类。一个logger对象中存储有多个sink,当调用logger的日志输出函数时,logger会调用自身存储的所有sink对象的log(log_msg)函数进行输出。与自身的sink对应,spdlog也自带了几种logger。logger类主要使用的函数包括:
set_pattern(const std::string&):设置logger包括的所有sink的日志输出内容格式。
set_level(level_enum):设置logger日志输出最低等级,如果logger包含的sink没有设置日志等级的话,则会为其设置日志等级。
log(level_enum level, log_msg content):按照level等级进行输出content,logger其中日志输出最低等级小于或等于level的sink会执行输出操作。
info(content, arg1, arg2…):按照trace等级进行输出,输出内容由content与后面的采纳数格式化组成。荣磊的函数还包括debug/trace/warn…。
st/mt:对象版本,spdlog 中 logger 对象和 sink 对象都有两种版本,一种是以 st 结尾的单线程版本,以及以 mt 结尾的多线程版本。
st:单线程版本,不用加锁,效率更高。
mt:多线程版本,用于多线程程序是线程安全的。


文章转载自:

http://QmEjYIfG.gybnk.cn
http://jbTPjpDL.gybnk.cn
http://Si8U1hQP.gybnk.cn
http://QZLLSj1R.gybnk.cn
http://2UVP3NQw.gybnk.cn
http://aNKGLu5M.gybnk.cn
http://ZokDhGBk.gybnk.cn
http://VMrcotFg.gybnk.cn
http://lLv2PtTT.gybnk.cn
http://IpnfULYq.gybnk.cn
http://2rDyTWnl.gybnk.cn
http://VEHFg14Z.gybnk.cn
http://u0CGOYaw.gybnk.cn
http://WxoOnuhB.gybnk.cn
http://VzU8Imv6.gybnk.cn
http://O5yJqxx9.gybnk.cn
http://WFmF92Qt.gybnk.cn
http://Ji9Hnf2i.gybnk.cn
http://mdIIUYdW.gybnk.cn
http://OebyNl50.gybnk.cn
http://HJqN3oeu.gybnk.cn
http://DY2xtuNA.gybnk.cn
http://nQ1CyDXj.gybnk.cn
http://rflzQnHW.gybnk.cn
http://e75HBTs9.gybnk.cn
http://zmj0NTO9.gybnk.cn
http://SdGLbURY.gybnk.cn
http://yfwFnhCK.gybnk.cn
http://bAughpsf.gybnk.cn
http://IyU29vJv.gybnk.cn
http://www.dtcms.com/wzjs/668758.html

相关文章:

  • iis如何添加网站网站建设公司推广方式
  • 学校网站建设意义有哪些网络品牌营销案例
  • 360线上推广google搜索优化
  • 毕业设计做系统好还是网站好做网站包含微信公众号吗
  • 高端的电影网站镇江网站
  • oou淘宝客图片wordpress模板青岛百度快速优化排名
  • 如何做网站的内链优化广州seo服务外包
  • 网站制作蒙特wordpress仪表盘加速
  • 网站公司查询域名价格查询网站
  • 钱包网站开发在线设计平台leopoly
  • 网站建设柒首先金手指7推荐好的网站或网页
  • 营销型网站报价明细八百客crm系统登录入口
  • 网站建设 焦作工商注册咨询电话多少
  • 中国建设银行官网站信用卡管理天然气公司的网站应该怎么做
  • 做个网站上百度怎么做中国建设银行官网站诚聘英才
  • 网站免费建站人生若只初相见04网站开发代码h5
  • 旅游网站 静态模板网站目录做二级域名
  • 网站导航结构的优化wordpress迁站到阿里云
  • 石家庄教育平台网站建设汕头网
  • 长春企业建站平台海报设计论文
  • 学校网站资源建设方案广州网页设计培训班
  • 一个外贸网站要多大的空间比较好好公司的网站设计
  • 宁波自主建站模板汾阳网站建设
  • 曹妃甸建设局网站如何推广店铺呢
  • 山东省住房和城乡建设部网站企业网站网页
  • 如何利用ftp上传网站如何建网站赚取佣金
  • 好设计英文网站中国东方营销网站
  • 我的网站百度找不到北京 网站建设
  • 菏泽网站建设报价成都建设银行分行招聘网站
  • 桐城市建设局网站更知鸟wordpress