spdlog日志
spdlog库满足我的需求:
- 支持windows平台
- 支持unicode
- 日志超过指定大小会自动新建
- c++
其他log库遇到的问题:
1、NanoLog
c++11版本,重启程序会覆盖原有日志内容,而且时间戳是1970年。如果您知道怎么设置请留言。
c++17版本,不支持windows。
2、fmtlog
不知道怎么指定日志大小超过一定值时自动新建日志😭。
3、QsLog
不支持 \n 换行。如果您知道怎么换行请留言。
【spdlog配置】
1、生成 lib
下载后解压,文件夹处鼠标右键,用VSCode打开,会自动弹出选择编译器,选择后自动在build文件夹中编译出sln。
VS打开sln(我的是VS2019),将spdlog设为启动项,先别生成、先别生成、先别生成……
做一件很重要的事:项目——属性,如下图设置,否则Unicode项目出错。
此时生成即可。debug、release各生成一次。
2、将用到的放一起
用到的是解压文件里的include和编译生成的lib,其他可以删除。
【spdlog使用】
#include<spdlog/spdlog.h> #include<spdlog/sinks/basic_file_sink.h> //for basic_logger_mt #include<spdlog/sinks/rotating_file_sink.h> //for rotating_logger_mt int main() { //输出到文件 auto basicLog=spdlog::basic_logger_mt("相机模块跟踪","logs/basic-log.txt", false);//false不覆盖,即append方式。否则每次重启软件内容会覆盖。 auto rotatLog=spdlog::rotating_logger_mt("图像模块跟踪", "logs/rotating.txt", 1024, 3);//超过1K则拆分,最多3个旧日志 auto rotatLog2 = spdlog::rotating_logger_mt("数据库模块跟踪", "logs/rotating2.txt", 1024*1024*5, 20);//一般够用了,5M、最多20个旧日志 //之后的信息会立刻写入 spdlog::flush_on(spdlog::level::info); //立刻写入≥info的,而不是程序关闭才写入 for (int n = 0; n < 500; ++n) { basicLog->info("中文支持\n换行支持"); basicLog->error("error等级的信息"); rotatLog->info("超过1K则新建文件"); rotatLog2->info("超过5M则新建文件"); } //输出到终端 spdlog::info("中文支持\n换行支持"); std::string str = "std标准库\n字符串"; int i = 3; float f = 3.1415; double doub = 2.414; spdlog::info("{0}, {1}, {2}, {3}", str, i, f, doub); spdlog::info("四位整数{:04d}", i); spdlog::info("保留两位小数{:.2f}", f); //其他知识 spdlog::debug("不会输出,默认info等级。等级顺序debug、info、warn、error、critical"); 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 {:06.2f}", 12.123456); spdlog::info("Positional args are {1} {0}..", "too", "supported"); spdlog::info("{:<3}", "left aligned"); spdlog::set_level(spdlog::level::debug); //等级设置 spdlog::debug("此时可以输出"); spdlog::shutdown(); //释放 }
【以日期新建文件夹】用于日志存放
基于qt
//新建日志文件夹,logs/年月日 QDateTime currentTime = QDateTime::currentDateTime(); QString currentDateDir = "logs/"+currentTime.toString("yyyyMMdd"); QDir dir; if (!dir.exists(currentDateDir)) { dir.mkdir(currentDateDir); } //新建日志 std::shared_ptr<spdlog::logger> rotateLog; rotateLog = spdlog::rotating_logger_mt("信息跟踪", currentDateDir.toStdString()+"/log.txt", 1024 * 1024 * 5, 20);//一般够用了,5M、最多20个旧日志 spdlog::flush_on(spdlog::level::info); //之后的信息(≥info)会立刻写入