• spdlog的简单封装和使用


    头文件:

    #ifndef _SIMLOG_H_
    #define _SIMLOG_H_
    #include <spdlog/spdlog.h>
    
    #ifdef _WIN32
    //strrchr:查找字符在指定字符串从右面开始的第一次出现的位置,如果成功,返回该字符以及后面的字符,如果失败,返回NULL
    //strcgr:查找字符在指定字符串首次出现的位置
    #define __FILENAME__ (strrchr(__FILE__,'\')?(strrchr(__FILE__,'\')+1):__FILE__)
    #else
    #define __FILENAME__ (strrchr(__FILE__,'/')?(strrchr(__FILE__,'/')+1):__FILE__)
    #endif //_WIN32
    
    #ifndef SUFFIX
    //在错误级别的日志后面追加文件名,函数名,行号
    #define SUFFIX(msg) std::string(msg).append("  <")
                        .append(__FILENAME__).append("> <").append(__FUNCTION__)
                        .append("> <").append(std::to_string(__LINE__))
                        .append(">").c_str()
    #endif //suffix
    
    /*
    日志等级:trace,debug,info,warn,err ,critical
    使用方法:包含simlog.h头文件,调用初始化函数,使用LDebug等打印日志信息
    例:
    SimLog::Instance().InitSimLog("scenario_edit", "scenario_edit_log.txt");
    int i = 10;
    double d_number = 10.01;
    LDebug("SimLog::Async message");
    LDebug("SimLog::Async message #{0},d_number:{1}", i,d_number);
    注:使用{}格式化字符串,里面的数字为占位符
    */
    
    #define LTrace(msg,...)  SimLog::Instance().GetLogger()->trace(SUFFIX(msg),__VA_ARGS__)
    #define LDebug(...)  SimLog::Instance().GetLogger()->debug(__VA_ARGS__)
    #define LInfo(...)  SimLog::Instance().GetLogger()->info(__VA_ARGS__)
    #define LWarn(...) SimLog::Instance().GetLogger()->warn(__VA_ARGS__)
    #define LError(msg,...)  SimLog::Instance().GetLogger()->error(SUFFIX(msg),__VA_ARGS__)
    #define LCritical(...)  SimLog::Instance().GetLogger()->critical(__VA_ARGS__)
    
    class SIMLOG_EXPORT SimLog
    {
    public:
        static SimLog&Instance();
    
        void InitSimLog(std::string logger_name,std::string file_name, int log_level= spdlog::level::trace);
    
        void EndLog();
    
        void SetLevel(int level = spdlog::level::trace);
    
        auto GetLogger() 
        {
            return my_logger_;
        }
    
    private:
        //私有构造函数,拷贝构造函数和拷贝赋值函数,禁止在类外声明实例
        SimLog();
        ~SimLog();
        SimLog(const SimLog &other) = delete;
        SimLog& operator=(const SimLog &other) = delete;
    
    private:
        std::shared_ptr<spdlog::logger> my_logger_;
    };
    
    #endif //_SIMLOG_H_

    源文件:

    #include "simlog.h"
    #include "spdlog/sinks/basic_file_sink.h"
    #include "spdlog/async.h"
    
    #include <QDateTime>
    #include <QDebug>
    #include <QString>
    
    
    SimLog& SimLog::Instance()
    {
        static SimLog log;
        return log;
    }
    
    void SimLog::InitSimLog(std::string logger_name, std::string file_name,int log_level)
    {
        //设置日志等级
        spdlog::set_level(static_cast<spdlog::level::level_enum>(log_level));
        //设置日志为异步日志,不带滚动,日志文件会一直写入
        my_logger_ = spdlog::basic_logger_mt<spdlog::async_factory >(logger_name, file_name);
        //当遇到错误级别以上的立刻刷新到日志
        my_logger_->flush_on(spdlog::level::err);
        //每三秒刷新一次
        spdlog::flush_every(std::chrono::seconds(3));
    
        //测试
        for (int i = 0; i < 101; i++)
        {
            my_logger_->info("SimLog::Async message #{}", i);
        }
    }
    
    void SimLog::EndLog()
    {
        spdlog::shutdown();
    }
    
    SimLog::SimLog()
    {
    
    }
    
    SimLog::~SimLog()
    {
        EndLog();
    }
    
    
    void SimLog::SetLevel(int level)
    {
        spdlog::set_level(static_cast<spdlog::level::level_enum>(level));
    }

    使用方法:

    (1)包含头文件

    (2)调用初始化函数

    (3)使用使用LDebug等打印日志信息

    例:
    SimLog::Instance().InitSimLog("test", "log.txt");
    int i = 10;
    double d_number = 10.01;
    LDebug("SimLog::Async message");
    LDebug("SimLog::Async message #{0},d_number:{1}", i,d_number);
    注:使用{}格式化字符串,里面的数字为占位符

  • 相关阅读:
    透明PNG格式图片兼容IE6浏览器
    CSS英文单词强制换行
    未能加载文件或程序集“Oracle.DataAccess, Version=2.111.7.0, Culture=neutral, PublicKeyToken=89b483f429c47342”或它的某一个依赖项。试图加载格式不正确的程序
    使用IIS 无法命中Application_Start中的断点问题
    win7 x64 后蓝牙u盘搜索不到其他设备
    使用Html.BeginForm<T>后客户端脚本验证出错的问题
    为什么使用sealed修饰符
    vs2010调试时发生监视显示表达式为false,但却进入了if块中
    MicrosoftMvcJQueryValidation.js 启用客户端验证,form无法提交
    Jquery 操作页面中iframe自动跟随窗口大小变化,而不出现滚动条,只在iframe内部出滚动条
  • 原文地址:https://www.cnblogs.com/LuckCoder/p/11171609.html
Copyright © 2020-2023  润新知