系列目录
spdlog日志库–基础介绍
spdlog日志库–源码解析
spdlog日志库–输出格式(fmt 库集成)
spdlog日志库–使用案例
从网上以及一些大佬对spdlog库的使用中,整理出spdlog常用的几种使用方式,供大家参考。如果哪些地方存在问题,还请大家在评论区中指出,我将更新优化,谢谢!
1. spdlog常用
用法
spdlog库的使用也非常简单,只需要下载源代码,然后把根目录下的include目录下的文件拷贝到我们的工程下,在工程中包含相应的头文件即可。
1.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_ptr<spdlog::logger> myLogger;
std::shared_ptr<spdlog::logger> myLogger;
1.1 基础用法
#include "spdlog/spdlog.h"
int main()
{
//Use the default logger (stdout, multi-threaded, colored)
spdlog::info("Hello, {}!", "World");
}
输出用法:
语法规则不再是过去的%d,%s这种容易出内存错误的规则。而是以 fmtlib为基准。fmtlib
spdlog输出格式详解_1
1.2 控制台打印
#include <spdlog/spdlog.h>
#include <string.h>
#include <iostream>
int main()
{
// 普通打印
spdlog::info("Welcome to info spdlog!");
// 格式化打印
// 打印字符串
spdlog::info("Hello World {}", "spdlog!");
// 打印数字
spdlog::error("spdlog errCode : {}", -10020);
// 指定打印数字的占位符
spdlog::warn("spdlog format char {:08d}", 12);
// 格式化打印不同进制的数据
spdlog::critical("Support for int:{0:d} hex:{0:x} oct:{0:o} bin:{0:b}", 42);
// 打印浮点型数据
spdlog::info("float args are {:03.2f}", 1.23456);
// 打印多个参数
spdlog::info("string args are {0} {1}..", "too", "supported");
spdlog::info("number args are {0} {1} {2}..", 10020, 10040, -100);
system("pause");
}
1.3 文件中打印
#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <string.h>
#include <iostream>
int main()
{
try
{
// 参数1 日志标识符, 参数2 日志文件名
std::shared_ptr<spdlog::logger> mylogger = spdlog::basic_logger_mt("spdlog", "spdlog.log");
//创建按按照大小,存储的文件
// 参数1 日志标识符, 参数2 日志文件名, 参数3,文件大小(1024 * 1024 * 5),参数4,文件个数
// systemLog = spdlog::rotating_logger_mt("SYS", sdLogFile, 1024 * 1024 * 5, 6);
// 设置日志格式. 参数含义: [日志标识符] [日期] [日志级别] [线程号] [数据]
mylogger->set_pattern("[%n][%Y-%m-%d %H:%M:%S.%e] [%l] [%t] %v");
// 设置日志格式. 参数含义: [日志标识符] [日期] [日志级别] [线程号] [文件名 函数名:行号] [数据]
// my_logger->set_pattern("[%n] [%Y-%m-%d %H:%M:%S.%e] [%l] [%t] [%s %!:%#] %v");
mylogger->set_level(spdlog::level::debug);
spdlog::flush_every(std::chrono::seconds(5)); // 定期刷新日志缓冲区
//日志的不同等级
mylogger->trace("Welcome to info spdlog!");
mylogger->debug("Welcome to info spdlog!");
mylogger->info("Welcome to info spdlog!");
mylogger->warn("Welcome to info spdlog!");
mylogger->error("Welcome to info spdlog!");
mylogger->critical("Welcome to info spdlog!");
// 刷新(按照日志等级)
mylogger->flush_on(spdlog::level::debug);
}
catch (const spdlog::spdlog_ex& ex)
{
std::cout << "Log initialization failed: " << ex.what() << std::endl;
}
system("pause");
}
1.4 按日志大小创建文件
// 包含此头文件
#include <spdlog/sinks/rotating_file_sink.h>
// 参数3:日志大小(字节)
// 参数4:回滚数
std::shared_ptr<spdlog::logger> file_logger = spdlog::rotating_logger_mt("spdlog", "spdlog.log", 1024, 5);
1.5 按日期创建文件
// 包含头文件
#include <spdlog/sinks/daily_file_sink.h>
#include <spdlog/sinks/hourly_file_sink.h>
// 按天回滚
std::shared_ptr<spdlog::logger> dailylogger = spdlog::daily_logger_mt("daily", "daily.log");
// 按小时回滚
std::shared_ptr<spdlog::logger> my_logger = spdlog::hourly_logger_mt("hourly", "hourly.log");
1.6 按照日志等级
enum class level_enum {
trace = SPDLOG_LEVEL_TRACE 0
debug = SPDLOG_LEVEL_DEBUG 1
info = SPDLOG_LEVEL_INFO 2(默认输出等级)
warn = SPDLOG_LEVEL_WARN 3
err = SPDLOG_LEVEL_ERROR 4
critical = SPDLOG_LEVEL_CRITICAL 5
off = SPDLOG_LEVEL_OFF 6
}
注:设置某个等级后,小于该等级的日志将不会被记录。
示例:
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_DEBUG
#include "spdlog/spdlog.h"
int main()