spdlog的简单封装和使用
封装 简单 使用
2023-09-14 09:07:08 时间
头文件:app
#ifndef _SIMLOG_H_
#define _SIMLOG_H_
#include <QtWidgets/QWidget>
#include <spdlog/spdlog.h>
#include "simlog_export.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));
}
使用方法:async
(1)包含头文件函数
(2)调用初始化函数测试
(3)使用使用LDebug等打印日志信息spa
例:
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);
注:使用{}格式化字符串,里面的数字为占位符debug
相关文章
- 网易首页导航封装类优化
- 简单的 Helper 封装 -- SecurityHelper 安全助手:封装加密算法(MD5、SHA、HMAC、DES、RSA)
- httpclient4.3简单封装
- sparkR集群启动脚本的封装。
- 简单的 Helper 封装 -- CookieHelper
- C#.NET万能数据库访问封装类(ACCESS、SQLServer、Oracle)
- 音视频封装格式:MPTG2-TS
- setStorage、getStorage、 removeStorage 封装
- pytest接口自动化测试框架 | pytest结合二次封装实现接口自动化
- Intel DAAL AI加速——支持从数据预处理到模型预测,数据源必须使用DAAL的底层封装库
- 如何优雅的封装转换前后端接口数据格式工具函数(下划线<=>大写)
- 【vue】vue中如何实现组件封装、组件化开发及组件间传参_08
- C++搭建集群聊天室(九):数据库代码及用户模型代码封装
- Python Selenium Unittest 自动化测试 简单封装类