• 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)会立刻写入
  • 相关阅读:
    POJ3666 Making the Grade[动态规划]
    vector内部的实现1
    win32概述
    stl概述
    C++概要简介
    类的常量成员
    模板
    c11标准
    异常处理
    pak文件的打包和解包
  • 原文地址:https://www.cnblogs.com/xixixing/p/15956412.html
Copyright © 2020-2023  润新知