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)会立刻写入

 

posted @ 2022-03-02 18:09  夕西行  阅读(1458)  评论(0编辑  收藏  举报