怎么做期货网站,微信公众号免费开通,50人办公室网络搭建,平台网站应该怎样做seo文章目录 1. 简介1.1. spdlog代码特点1.2. 说明1.3. spdlog架构 2. spdlog的安装2.1. 使用包管理器安装2.2. 使用源码安装2.3. 仅使用头文件 3. 相关概念3.0 常用的头文件3.1. level_enum3.2. sink3.3. logger3.4 格式输出3.5 对齐方式3.6 截断3.7 字符串格式化fmt 4. 特性4.1.… 文章目录 1. 简介1.1. spdlog代码特点1.2. 说明1.3. spdlog架构 2. spdlog的安装2.1. 使用包管理器安装2.2. 使用源码安装2.3. 仅使用头文件 3. 相关概念3.0 常用的头文件3.1. level_enum3.2. sink3.3. logger3.4 格式输出3.5 对齐方式3.6 截断3.7 字符串格式化fmt 4. 特性4.1. 特性——同步、异步4.2. 特性——单、多线程处理模式4.3. 特性——个性化输出格式(pattern)4.4. 特性——刷新机制4.5. 特性——异常处理4.6. 特性——日志类型 5. 日志输出5.1. 基本文件5.2. 循环文件5.3. 每日文件 参考链接 1. 简介 
spdlog是开源、高性能、快速、跨平台支持header-only/compiled的C日志库spdlog是基于C11实现的一款纯头文件的日志管理库。 Git地址 API说明 应用示例 WiKi 
1.1. spdlog代码特点 
spdlog主要基于C11开发(若编译环境支持C20则将使用std::fmt取代第三方fmt库)。 spdlog中大量使用移动语义、完美转发以减少对象拷贝又利用内联、模板等技术尽量减少了抽象的代价。 同时广泛使用了智能指针等降低了内存管理的复杂性通过spdlog可以深入的了解C11的优雅实现。 
1.2. 说明 
高效与快速Spdlog 专注于提供极致的性能在大量日志记录场景下也能保持较低的延迟和较高的吞吐量。轻量化设计Spdlog 是头文件header-only库这意味着用户只需要包含相应的头文件即可开始使用无需编译链接额外的库文件即将spdlog/include目录下的文件拷贝到你的项目中仅包含头文件即可。跨平台支持它支持多种操作系统包括但不限于 Windows、Linux 和 macOSLinux / Windows on 32/64 bits并且在这些平台上都能够良好运行。丰富的日志级别Spdlog 支持常见的日志级别如 TRACE、DEBUG、INFO、WARN、ERROR、CRITICAL 等用户可以根据需要选择不同级别的日志输出。格式化与定位信息可自定义日志格式通过集成 fmt(fmtlib) 库Spdlog 允许用户自定义日志消息的格式可以轻松地包含时间戳、线程ID、文件名、行号以及函数名等上下文信息。多目标输出可以将日志输出到控制台、普通文本文件、循环写入文件rotating log files、每日生成新文件daily logs、系统日志等目标同时也支持异步写入以提高性能。线程安全对于多线程环境Spdlog 提供了线程安全的日志接口确保在并发环境下日志记录的正确性和完整性。 spdlog中各对象都分为多线程与单线程版本 _st单线程版本不用加锁效率更高。*_mt多线程版本用于多线程程序是线程安全的。 异步模式提供可选的异步日志记录机制能够将日志操作放入后台线程执行从而避免阻塞主线程。条件日志根据预定义的条件开关可以动态启用或禁用特定级别的日志输出例如 可自定义文档大小可实现自动按日期创建日志文件/定时创建日志文件。 
1.3. spdlog架构 
spdlog可以分成三级结构从上而下是logger registry、logger、sink。  logger/async_logger日志记录器 日志处理的入口负责格式化日志信息、日志信息的整理合并(如日志级别、文件名、函数名、文件行号等)最终封装至log_msg对象中再将log_msg对象投递给下游处理。是用户直接操作的对象通过操作logger进行日志逻辑的生成。 logger与aync_logger区别在于 1logger是同步处理会由调用日志记录的线程直接将封装后的log_msg对象投递给下游的sink。 2aync_logger则是异步处理调用日志记录的线程仅负责将封装后的log_msg对象放入线程安全队列后续由线程池从线程安全队列中不断处理队列中的日志对象。  
一个logger对象中存储有多个sink当调用logger的日志输出函数时logger会调用自身存储的所有sink对象的log(log_msg) 函数进行输出。logger中主要包括 
set_pattern(const std::string)设置logger包含的所有sink的日志输出内容格式。
set_level(level_enum)设置logger日志输出最低等级如果logger包含的sink没有设置日志等级的话则会为其设置日志等级。
log(level_enum level,log_msg content)按照level等级进行输出contentlogger其中日志输出最低等级小于或等于level的sink会进行执行输出操作。
trace(content,arg1,arg2…)按照trace等级进行输出输出内容由content与后面的参数格式化而成。同类的函数还包括debug/info/warn…。sink日志记录槽 受logger控制执行具体的动作(动作包括写入日志文件/输出到控制台)即负责接收log_msg对象并通过formatter将对象中记录的信息转换为字符串最终将字符串输出到目标位置(控制台、日志文件等)。 spdlog定义了几种sinks用于不同场景也可自定义下的日志输出sink中主要包含 
set_pattern(const std::string)设置日志输出的内容格式。
set_level(level_enum) 设置日志输出的最低等级。
log(log_msg)由logger自动调用外部不会主动调用。formatter 负责将log_msg对象中的信息转换成字符串。 通过set_pattern可设定日志格式如set_pattern([%Y-%m-%d %H:%M:%S.%e][%l](%): %v);  registry(logger registry 日志管理器) 负责管理所有的logger(创建、销毁、获取等)并且通过registry还可对所有的logger做全局设置。例如可通过spdlog::get()访问已创建的logger。  总结 简单来说就是一个logger registry管多个logger一个logger管多个sink。 logger registry中的logger是通过name进行对应的。后面使用的时候可以直接通过名称获取对应的日志对象。 有了这种层级结构在代码调用的时候logger的每个操作都会下顺到sink层面调用sink的对象。比如像一些set_pattern()和set_level()。 说到底日志库的目的就是把日志信息写到指定地方。从上面对于结构的功能描述sink才是真正操作日志进行写操作的结构。 那sink可以把日志信息写到哪里呢主要有三个去向  1 控制台输出(stdout)——默认输出方式2 日志文件3 数据库或其他外部实体从使用的角度上讲用文件存储日志比直接存储在数据库中更加常用一点。  
2. spdlog的安装 
2.1. 使用包管理器安装 
Debian: sudo apt install libspdlog-devHomebrew: brew install spdlogMacPorts: sudo port install spdlogFreeBSD: pkg install spdlogFedora: dnf install spdlogGentoo: emerge dev-libs/spdlogArch Linux: pacman -S spdlogopenSUSE: sudo zypper in spdlog-develvcpkg: vcpkg install spdlogconan: spdlog/[1.4.1]conda: conda install -c conda-forge spdlogbuild2: depends: spdlog ^1.8.2 
2.2. 使用源码安装 
$ git clone https://github.com/gabime/spdlog.git
$ cd spdlog  mkdir build  cd build
$ cmake ..  make -j2.3. 仅使用头文件 
将spdlog/include目录下的文件拷贝到你的项目中即可。 
3. 相关概念 
3.0 常用的头文件 
#include include/spdlog/spdlog.h
#include include/spdlog/sinks/stdout_color_sinks.h
//根据放置库的位置编写对应的头文件 #include spdlog/sinks/basic_file_sink.h
#include include/spdlog/sinks/basic_file_sink.h
#include include/spdlog/sinks/rotating_file_sink.h
#include include/spdlog/sinks/daily_file_sink.h
#include include/spdlog/sinks/dist_sink.h
#include afxcontrolbars.h#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE		//需要输出文件名和行号必须输出这个宏
using namespace spdlog;#include memory
#include string
#include conio.h#include spdlog/spdlog.h
#include spdlog/fmt/bin_to_hex.h
#include spdlog/fmt/bundled/core.h
#include spdlog/fmt/bundled/args.h
#include spdlog/fmt/bundled/format.h
// 设置为智能指针类型用于在 C 中管理 spdlog::logger 类型对象的生命周期
extern std::shared_ptrspdlog::logger myLogger;
std::shared_ptrspdlog::logger myLogger;3.1. level_enum 
日志级别定义如下 
enum class level_enum {trace  SPDLOG_LEVEL_TRACE 0debug  SPDLOG_LEVEL_DEBUG 1info   SPDLOG_LEVEL_INFO  2(默认输出等级)warn  SPDLOG_LEVEL_WARN 3err  SPDLOG_LEVEL_ERROR   4critical  SPDLOG_LEVEL_CRITICAL 5off   SPDLOG_LEVEL_OFF 6
}设置某个等级后小于该等级的日志将不会被记录。 
3.2. sink 
日志记录器槽用于设置日志的输出目的地如控制台、文件等。 常用函数 
1. virtual void log(const details::log_msg msg)  0; //记录日志有logger自动调用 
2. virtual void flush()  0;         				  // 刷新日志  
//用于设置日志消息的格式模板。通过指定格式模板你可以控制日志消息的外观包括日期、时间、日志级别、线程ID、日志内容等等。
//例如set_pattern([%Y-%m-%d %H:%M:%S.%e][%l](%): %v)
3. virtual void set_pattern(const std::string pattern)  0;  
// 设置自定义的格式化器  
4. virtual void set_formatter(std::unique_ptrspdlog::formattersink_formatter)  0; 
5. void set_level(level::level_enum log_level);    //设置输出日志的最低级别  
6. level::level_enum level() const;     // 获取日志级别  
7. bool should_log(level::level_enum msg_level) const; //判断是否需要记录日志set_formatter方法用于设置自定义的日志消息格式化器。通过设置自定义格式化器你可以完全掌控日志消息的外观而不仅仅是使用预定义的格式模板。 
3.3. logger 
日志记录器用于记录日志。 一个logger对象中存储有多个sink当调用logger的日志输出函数时logger会调用自身存储的所有sink对象的log(log_msg) 函数进行输出。与自带的sink对应spdlog也自带了几种logger。 logger类主要使用的函数包括 
templatetypename T
void trace(const T msg) // 记录trace级别的日志
{log(level::trace, msg);
}templatetypename T
void debug(const T msg) // 记录debug级别的日志
{log(level::debug, msg);
}templatetypename T
void info(const T msg)
{log(level::info, msg);
}templatetypename T
void warn(const T msg)
{log(level::warn, msg);
}templatetypename T
void error(const T msg)
{log(level::err, msg);
}templatetypename T
void critical(const T msg)
{log(level::critical, msg);
}// return true logging is enabled for the given level.
bool should_log(level::level_enum msg_level) const
{return msg_level  level_.load(std::memory_order_relaxed);
}// return true if backtrace logging is enabled.
bool should_backtrace() const
{return tracer_.enabled();
}void set_level(level::level_enum log_level); // 设置日志级别level::level_enum level() const;const std::string name() const;// set formatting for the sinks in this logger.
// each sink will get a separate instance of the formatter object.
void set_formatter(std::unique_ptrformatter f);// set formatting for the sinks in this logger.
// equivalent to
//     set_formatter(make_uniquepattern_formatter(pattern, time_type))
// Note: each sink will get a new instance of a formatter object, replacing the old one.
void set_pattern(std::string pattern, pattern_time_type time_type  pattern_time_type::local);// backtrace support.
// efficiently store all debug/trace messages in a circular buffer until needed for debugging.
void enable_backtrace(size_t n_messages);
void disable_backtrace();
void dump_backtrace();// flush functions
void flush();
void flush_on(level::level_enum log_level);
level::level_enum flush_level() const;// sinks
const std::vectorsink_ptr sinks() const;std::vectorsink_ptr sinks();// error handler
void set_error_handler(err_handler);// create new logger with same sinks and configuration.
virtual std::shared_ptrlogger clone(std::string logger_name);3.4 格式输出 
通过set_pattern可设定日志格式如set_pattern([%Y-%m-%d %H:%M:%S.%e][%l](%): %v); 
flagmeaningexample%v日志内容“my log test content”%t 线程ID“123”%P进程ID“234”%n记录器Logger名“basicLogger”%l日志级别“debug”, “info”, etc%L日志级别简称“D”, “I”, etc%a星期几简称“Thu”%A星期几“Thursday”%b月份简称“Aug”%B月份“August”%c日期时间“Thu Aug 23 15:35:46 2014”%C年两位“14”%Y 年“2014”%D %x日期简写“08/23/14”%m月份数字“11”%d日数组“29”%H小时24制“23”%I小时12制“11”%M分钟“59”%S秒“58”%e毫秒“678”%f微秒“056789”%F纳秒“256789123”%pAM/PM“AM”%r时间12制“02:55:02 pm”%R时分24制“23:55”%T %X时间24制“23:55:59”%z时区偏移“02:00”%Eepoch秒“1528834770”%%百分号“%”%默认格式“[2014-10-31 23:46:59.678] [mylogger] [info] Some message”%^start color range (can be used only once)“[mylogger] [info(green)] Some message”%$end color range (for example %^ []%$ %v) (can be used only once)[] Some message%文件名与行数my_file.cpp:123%s文件名my_file.cpp%g文件名含路径/some/dir/my_file.cpp%#行数123%!函数名my_func%o相对上一条记录的时间间隔毫秒456%i相对上一条记录的时间间隔微秒456%u相对上一条记录的时间间隔纳秒11456%O相对上一条记录的时间间隔秒4 
日志输出中要携带文件名、行数或函数名时必须使用SPDLOG_LOGGER_*宏且要激活对应的级别哪些级别以上的日志会被记录 
// 记录INFO及以上级别日志
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO
#include spdlog/spdlog.hSPDLOG_LOGGER_INFO(myLogger, Support for floats {:03.2f}, 1.23456);
SPDLOG_LOGGER_WARN(myLogger, Easy padding in numbers like {:08d}, 12);3.5 对齐方式 
每个flag都可携带对齐方式最多支持64字符 
alignmeaningexampleresult%右对齐%8l info%-左对齐%-8linfo %居中%8l info  
3.6 截断 
截断: 通过可设定对应输出的最大长度 
alignmeaningexampleresult%!右对齐且截断%3!l“inf”%-!左对齐且截断%-2!l“in”%!居中且截断%1!l“i” 
3.7 字符串格式化fmt 
spdlog中字符串格式化使用fmt库。 格式化方式{ [arg_id] [: (format_spec | chrono_format_spec)] } 
arg_id参数标识 忽略为空时依次对应每一个参数索引数字从0开始引用第几个索引 名称命名参数 format_spec参数格式化方式类型、对齐、填充等 
Format Specification 格式化符说明 
format_spec ::  [[fill]align][sign][#][0][width][. precision][L][type]
fill        ::  a character other than { or }
align       ::   |  | ^ // 左、右、居中对齐
sign        ::   | - |  
width       ::  integer | {[arg_id]} // 宽度数字或指定的参数
precision   ::  integer | {[arg_id]} // 精度数字或指定的参数
type        ::  a | A | b | B | c | d | e | E | f | F | g | G | o | p | s | x | X不同的转换下有不同的意义 
整数时表示前面添加进制前缀如0x, 0b等浮点数时总是有小数点即使没有小数部分 
L只对数字有效根据本地设置来输出如 
auto s  fmt::format(std::locale(en_US.UTF-8), {:L}, 1234567890);
// s  1,234,567,890格式化类型 
typemeanings字符串c字符b/B二进制d数字十进制o八进制x/X十六进制a/A十六进制浮点数p表示指数e/E科学计数f/F浮点数包括NANINF固定小数位数输出g/G浮点数输出p指针 
示例 
fmt::format({:*^30}, centered);  // use * as a fill char
// Result: ***********centered***********fmt::format({:#04x}, 0);
// Result: 0x00fmt::print(┌{0:─^{2}}┐\n│{1: ^{2}}│\n└{0:─^{2}}┘\n, , Hello, world!, 20);
┌────────────────────┐
│   Hello, world!    │
└────────────────────┘4. 特性 
4.1. 特性——同步、异步 
这里的同步/异步指日志信息是否直接输出/写入文件直接写就是同步稍后写就是异步。spdlog默认的状态就是同步了同步也没什么好说的。 这里介绍下异步的逻辑实现   异步状态下日志会先存入队列然后由线程从队列中取数据当队列满的时候会有淘汰策略。如果工作线程中抛出了异常向队列写入下一条日志时异常会再次抛出可以在写入队列时捕捉工作者线程的异常淘汰策略一般两种 阻塞新来的的日志直到队列有剩余空间(默认处理方式)把新的日志丢掉(需要设定spdlog::set_async_mode(队列大小spdlog::async_overflow_policy::discard_log_msg)) 4.2. 特性——单、多线程处理模式 
spdlog中提供了单线程和多线程模式由使用者在对象创建中自己指定。 st单线程版本不用加锁效率高但不保证线程安全mt多线程版本保证多线程并发情况线程安全但效率稍低 4.3. 特性——个性化输出格式(pattern) 
一般情况下希望输出的日志信息中带有各类基本信息。 但具体情况要具体分析spdlog中提供了个性化的输出方式可以自己指定模式进行输出。 基本上就是各类“%参数”的组合。具体内容可以参考Custom formatting 。 
4.4. 特性——刷新机制 
spdlog使用中需要设置刷新规则以防止诸如程序闪退时日志未及时写入导致无法通过日志内容分析程序崩溃原因。 spdlog刷新设置主要有两种设置方式一种是全局设置一种是对于重要的日志信息之后立即写入。 两种刷新方式 
程序正常退出时写入(默认)程序运行中在指定位置进行写入(实时刷新日志便于锁定错误所在位置) 
全局设置支持设置刷新周期和刷新级别两种方式。flush_on()和flush_every()。 要想使用实时刷新日志spdlog提供了两种方法 方法一logger对象-flush_on(设定等级)flush_on是一次性刷新执行到此时按照设定等级进行日志刷新。 方法二logger对象-flush_every(周期时间)flush_every是设置刷新周期定时进行刷新。刷新的级别采取默认了。 示例 
//定时刷新日志缓冲区
spdlog::flush_every(std::chrono::seconds(3));
// trigger flush if the log severity is error or higher    如果日志严重性为错误或更高则触发刷新
daily_logger-flush_on(spdlog::level::err);
// 刷新缓冲区
my_logger-flush();4.5. 特性——异常处理 
对于日志库来说当异常发生时应该要输出异常出现的位置。spdlog会向std::err打印一条语句(终端可显示)。为了防止异常语句刷屏打印的频率固定在每分钟一条。 实例 try{//设置循环输出的日志my_logger spdlog::rotating_logger_mt(hil, log.txt, 1024 * 1024 * 5, 2);my_logger-set_level(spdlog::level::debug);//启动在调用hillo-trace的时候把日志放到一个ringbuffer(环形内存)里面,最多64条日志my_logger-enable_backtrace(64);//定时刷新spdlog::flush_every(std::chrono::seconds(3));}catch (const spdlog::spdlog_ex ex){return 0;}#define FLUSHLOG() do{if(my_logger){my_logger-flush();}}while(0)
#define DUMP_LOGTRACE() do{if(my_logger){my_logger-dump_backtrace();}}while(0)4.6. 特性——日志类型 
根据输出类型基本可分为输出到终端和文件两种类型其中输出文件类型可进一步分为按文件大小和日期滚动刷新。 
按日期滚动刷新是指每隔24小时到达指定的时间后会创建新的日志文件按文件大小滚动刷新是指日志文件尺寸达到设定值后会将当前文件添加后缀进行重命名然后创建新的空日志文件进行写入。 
此外spdlog还支持自定义日志写入规则可通过自定义sink类实现。 
日志格式设置 spdlog支持自定义日志格式但是自定义的logger往往不支持自定义格式需要使用spdlog提供的宏定义调用可以实现自定义输出格式。 
相关术语 
术语释义logger用于记录日志的对象rotate日志文件的切换registry注册处从统一一个位置来获得loggersink实际执行落日志到文件或DB动作的类mtmultiple-thread 的缩写带_mt后缀的是多线程安全的stsingle-thread的缩写带_st的函数非线程安全的exexception的缩写spdlog::spdlog_exslot插槽在spdlog线程池构造时预分配queue slottweaking(稍稍改进)自己可以指定一些参数。flush刷日志bundled捆绑的spdlog/include/spdlog/fmt/bundled/ 使用的外部库的代码 
5. 日志输出 
spdlog作为一个高性能的C日志库提供了多种灵活的日志输出方式以满足不同场景下的需求。以下是spdlog几种正常的输出方式的详细说明 
控制台输出stdout 说明这是spdlog的默认输出方式之一即将日志信息直接打印到控制台通常是终端或命令行界面。 特点便于开发者即时查看日志信息特别是在开发过程中进行调试时。 示例通过包含spdlog/spdlog.h头文件并使用spdlog::info等函数直接输出日志到控制台。文件输出 基本文件日志spdlog::basic_logger 说明创建一个只向单个文件写入日志的日志器。 特点所有日志都会在该文件中累加适用于不需要频繁轮转日志文件的场景。 示例使用spdlog::basic_logger_mt多线程安全版本创建一个日志器并指定文件名。 循环日志spdlog::rotating_logger 说明当日志文件达到一定大小时会自动创建一个新的日志文件继续写入而旧的日志文件会被保留但数量有限制。 特点适用于日志文件可能会快速增长的场景可以有效管理磁盘空间。 示例使用spdlog::rotating_logger_mt函数指定文件名、最大文件大小和最大文件数量。 按天轮转日志spdlog::daily_logger 说明每天在指定的时间点创建一个新的日志文件并开始向新文件写入日志。 特点便于按天管理日志便于后续分析和归档。 示例使用spdlog::daily_logger_mt函数指定文件名和每天的轮转时间小时和分钟。系统日志输出 说明虽然spdlog本身可能不直接提供将日志输出到系统日志如syslog的功能但可以通过集成或封装其他库如syslog-ng、rsyslog等来实现。 特点系统日志通常由操作系统管理适合需要与系统其他部分集成或符合特定日志管理规范的场景。自定义输出 说明spdlog支持通过自定义sink日志接收器来实现自定义的日志输出方式。 特点高度灵活可以根据实际需求将日志输出到数据库、网络、自定义消息队列等。 示例通过继承spdlog::sink类并实现相关接口可以创建自定义的sink来接收日志信息。异步输出 说明spdlog提供了异步日志记录机制可以将日志操作放入后台线程执行避免阻塞主线程。 特点提高程序性能特别是在高并发或日志量大的场景下。 示例使用spdlog::async_logger或相关函数创建异步日志器。 综上所述spdlog提供了包括控制台输出、文件输出基本文件日志、循环日志、按天轮转日志、系统日志输出通过集成、自定义输出以及异步输出在内的多种日志输出方式。这些方式使得spdlog能够灵活适应不同场景下的日志记录需求。 
5.1. 基本文件 
最简单的日志文件 
#include spdlog/sinks/basic_file_sink.h
void basic_logfile_example()
{try {auto logger  spdlog::basic_logger_mt(basic_logger, logs/basic-log.txt);}catch (const spdlog::spdlog_ex ex){std::cout  Log init failed:   ex.what()  std::endl;}
}5.2. 循环文件 
日志文件超过指定大小后自动生成一个新的并且只保留最多指定数量的日志文件 
#include spdlog/sinks/rotating_file_sink.h
void rotating_example()
{// Create a file rotating logger with 5mb size max and 3 rotated filesauto max_size  1024*1024 * 5;auto max_files  3;auto logger  spdlog::rotating_logger_mt(some_logger_name, logs/rotating.txt, max_size, max_files);
}5.3. 每日文件 
每天指定时间生成一个新的日志文件 
#include spdlog/sinks/daily_file_sink.h
void daily_example()
{// Create a daily logger - a new file is created every day on 2:30amauto logger  spdlog::daily_logger_mt(daily_logger, logs/daily.txt, 2, 30);
}完整示例 设定默认日志记录文件并在不同地方获取使用 
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_INFO#include spdlog/spdlog.h
#include spdlog/sinks/rotating_file_sink.hvoid writeLog(int n) {for (int i  0; i  n; i) {// 获取logger后输出日志auto myLogger  spdlog::get(baseLogger);myLogger-info({}: Hello, {}!, i  1, World);myLogger-info(Welcome to spdlog!);myLogger-error(Some error message with arg: {}, 1);// 带文件名与行号的日志输出SPDLOG_LOGGER_INFO(myLogger, Support for floats {:03.2f}, 1.23456);SPDLOG_LOGGER_WARN(myLogger, 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::error(Some error message with arg: {}, 1);spdlog::warn(Easy padding in numbers like {:08d}, 12);spdlog::info(Support for floats {:03.2f}, 1.23456);}
}void testSPDLog() {// 设定日志最大100k且最多保留10个auto myLogger  spdlog::rotating_logger_mt(baseLogger, logs/basic.log, 1024 * 100, 10);spdlog::set_default_logger(myLogger);myLogger-set_pattern([%Y-%m-%d %H:%M:%S.%e][%l](%): %v); // 非通过宏输出的日志%输出为空myLogger-set_level(spdlog::level::info);myLogger-info(Hello, {}!, World);writeLog(10);
}参考链接 
[C]-日志记录库SPDLog简介 spdlog使用学习笔记 C日志记录库SPDLog C日志记录库SPDLog_V 字符串资源_1 字符串资源_2 
spdlog spdlog 快速的 C 日志库 C高性能日志库spdlog使用指南 C日志记录库SPDLog简介 轻量级C11日志库spdlog 
spdlog使用_蜗牛单行道的博客-CSDN博客_spdlog spdlog学习笔记_haojie_superstar的博客-CSDN博客_spdlog [C]-日志记录库SPDLog简介[通俗易懂] - 全栈程序员必看 (javaforall.cn) spdlog简介_JontyZh的博客-CSDN博客_spdlog 输出格式 spdlog 基本结构分析 - 小胖西瓜 - 博客园 (cnblogs.com) 文章转载自: http://www.morning.jqkrt.cn.gov.cn.jqkrt.cn http://www.morning.nydgg.cn.gov.cn.nydgg.cn http://www.morning.kspfq.cn.gov.cn.kspfq.cn http://www.morning.cdlewan.com.gov.cn.cdlewan.com http://www.morning.zshuhd015.cn.gov.cn.zshuhd015.cn http://www.morning.hlwzd.cn.gov.cn.hlwzd.cn http://www.morning.mmclj.cn.gov.cn.mmclj.cn http://www.morning.rbsxf.cn.gov.cn.rbsxf.cn http://www.morning.kflpf.cn.gov.cn.kflpf.cn http://www.morning.jyfrz.cn.gov.cn.jyfrz.cn http://www.morning.jqcrf.cn.gov.cn.jqcrf.cn http://www.morning.rksnk.cn.gov.cn.rksnk.cn http://www.morning.qlry.cn.gov.cn.qlry.cn http://www.morning.wlnr.cn.gov.cn.wlnr.cn http://www.morning.drcnf.cn.gov.cn.drcnf.cn http://www.morning.zwndt.cn.gov.cn.zwndt.cn http://www.morning.dskzr.cn.gov.cn.dskzr.cn http://www.morning.yesidu.com.gov.cn.yesidu.com http://www.morning.ptqbt.cn.gov.cn.ptqbt.cn http://www.morning.zxqqx.cn.gov.cn.zxqqx.cn http://www.morning.prznc.cn.gov.cn.prznc.cn http://www.morning.sgjw.cn.gov.cn.sgjw.cn http://www.morning.pghfy.cn.gov.cn.pghfy.cn http://www.morning.hksxq.cn.gov.cn.hksxq.cn http://www.morning.dfygx.cn.gov.cn.dfygx.cn http://www.morning.bnrff.cn.gov.cn.bnrff.cn http://www.morning.xmpbh.cn.gov.cn.xmpbh.cn http://www.morning.yhljc.cn.gov.cn.yhljc.cn http://www.morning.bpmtq.cn.gov.cn.bpmtq.cn http://www.morning.tgbx.cn.gov.cn.tgbx.cn http://www.morning.ysnbq.cn.gov.cn.ysnbq.cn http://www.morning.nzzws.cn.gov.cn.nzzws.cn http://www.morning.hxbjt.cn.gov.cn.hxbjt.cn http://www.morning.xqnzn.cn.gov.cn.xqnzn.cn http://www.morning.wnmdt.cn.gov.cn.wnmdt.cn http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn http://www.morning.brtxg.cn.gov.cn.brtxg.cn http://www.morning.wddmr.cn.gov.cn.wddmr.cn http://www.morning.xphcg.cn.gov.cn.xphcg.cn http://www.morning.fslxc.cn.gov.cn.fslxc.cn http://www.morning.lcbt.cn.gov.cn.lcbt.cn http://www.morning.fqpyj.cn.gov.cn.fqpyj.cn http://www.morning.rnqrl.cn.gov.cn.rnqrl.cn http://www.morning.bfbl.cn.gov.cn.bfbl.cn http://www.morning.fktlg.cn.gov.cn.fktlg.cn http://www.morning.skqfx.cn.gov.cn.skqfx.cn http://www.morning.bpmdx.cn.gov.cn.bpmdx.cn http://www.morning.yrjxr.cn.gov.cn.yrjxr.cn http://www.morning.pjxw.cn.gov.cn.pjxw.cn http://www.morning.nlzpj.cn.gov.cn.nlzpj.cn http://www.morning.iuibhkd.cn.gov.cn.iuibhkd.cn http://www.morning.mrckk.cn.gov.cn.mrckk.cn http://www.morning.jthjr.cn.gov.cn.jthjr.cn http://www.morning.bsxws.cn.gov.cn.bsxws.cn http://www.morning.ggnrt.cn.gov.cn.ggnrt.cn http://www.morning.lnyds.cn.gov.cn.lnyds.cn http://www.morning.ghslr.cn.gov.cn.ghslr.cn http://www.morning.mhcys.cn.gov.cn.mhcys.cn http://www.morning.qqxmj.cn.gov.cn.qqxmj.cn http://www.morning.gcbhh.cn.gov.cn.gcbhh.cn http://www.morning.stsnf.cn.gov.cn.stsnf.cn http://www.morning.qzdxy.cn.gov.cn.qzdxy.cn http://www.morning.cwtrl.cn.gov.cn.cwtrl.cn http://www.morning.ckhpg.cn.gov.cn.ckhpg.cn http://www.morning.ykxnp.cn.gov.cn.ykxnp.cn http://www.morning.tdhxp.cn.gov.cn.tdhxp.cn http://www.morning.wfjrl.cn.gov.cn.wfjrl.cn http://www.morning.gyylt.cn.gov.cn.gyylt.cn http://www.morning.pmtky.cn.gov.cn.pmtky.cn http://www.morning.hqlnp.cn.gov.cn.hqlnp.cn http://www.morning.gcdzp.cn.gov.cn.gcdzp.cn http://www.morning.msbpb.cn.gov.cn.msbpb.cn http://www.morning.mmtjk.cn.gov.cn.mmtjk.cn http://www.morning.rhqr.cn.gov.cn.rhqr.cn http://www.morning.cfnsn.cn.gov.cn.cfnsn.cn http://www.morning.bkpbm.cn.gov.cn.bkpbm.cn http://www.morning.skfkx.cn.gov.cn.skfkx.cn http://www.morning.srbsr.cn.gov.cn.srbsr.cn http://www.morning.gmztd.cn.gov.cn.gmztd.cn http://www.morning.kfbth.cn.gov.cn.kfbth.cn