spdlog wiki:https://github.com/gabime/spdlog/wiki

别人的学习笔记:https://www.cnblogs.com/oucsheep/p/8426548.html

别人的学习笔记:https://github.com/gabime/spdlog/wiki

百度搜 spdlog 封装可以看到很多写的差不多的单例类,我看公司遗留的代码也是借鉴这些写的。

最常见的是一开头就写上:

#ifdef _WIN32
#define __FILENAME__ (strrchr(__FILE__, '\\') ? (strrchr(__FILE__, '\\') + 1):__FILE__)
#else
#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__)
#endif//定义一个在日志后添加 文件名 函数名 行号 的宏定义
#ifndef suffix
#define suffix(msg)  std::string(msg).append("  <")\.append(__FILENAME__).append("> <").append(__func__)\.append("> <").append(std::to_string(__LINE__))\.append(">").c_str()
//#define suffix(msg)  std::string().append(" File:")\
//        .append(__FILENAME__).append("\", Func:\"").append(__func__)\
//        .append("()\", Line:\"").append(std::to_string(__LINE__)).append("\"").append(msg).c_str()
#endif

这种文件行号之类的 spdlog 本身也自带,可以参见 SPDLOG_LOGGER_CALL 宏定义,用这个还得加上宏:

#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE

不过它自带的函数用的 __FUNCTION__ 在 VS 下会显示类名,我自定义改成了 __func__ 只保留了函数名。

代码如下:

#pragma once//定义宏使输出文件名和行号
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE
#define SPDLOG_TRACE_ON
//#define SPDLOG_DEBUG_ON#include "spdlog/spdlog.h"
#include "spdlog/sinks/easy_file_sink.h"
//#include "spdlog/sinks/daily_file_sink.h"//spdlog 简易封装
//龚建波 2021-1-27 修改
//''' 示例
// Qt使用时 CONFIG += utf8_source
// INITLOG(QString("日志.log").toLocal8Bit().toStdString());
// ERRORLOG("测试下 {0} {1} {2} {3}",123,true,"测试下",QString("测试下").toStdString());
// WARNLOG("测试下 {0} {1} {2} {3}",123,true,"测试下",QString("测试下").toStdString());
// INFOLOG("测试下 {0} {1} {2} {3}",123,true,"测试下",QString("测试下").toStdString());
// DEBUGLOG("测试下 {0} {1} {2} {3}",123,true,"测试下",QString("测试下").toStdString());
// TRACELOG("测试下 {0} {1} {2} {3}",123,true,"测试下",QString("测试下").toStdString());
//'''
//spdlog讲解参见博客 https://www.cnblogs.com/oucsheep/p/8426548.html
class BaseLog
{
private:BaseLog()=default;
public:static BaseLog* getInstance() {static BaseLog instance;return &instance;}//初始化日志,路径使用locale编码//如: QString("日志.log").toLocal8Bit().toStdString()void init(const std::string& path){//自定义的sinklogPtr = spdlog::easy_logger_mt("easy",path,1024*1024*25);//可以配置多个sink//std::make_shared<spdlog::logger>//spdlog::register_logger(logPtr); 配合 spdlog::drop_all();//设置日志记录级别logPtr->set_level(spdlog::level::trace);//设置格式//参见文档 https://github.com/gabime/spdlog/wiki/3.-Custom-formatting//[%Y-%m-%d %H:%M:%S.%e] 时间//[%l] 日志级别//[%t] 线程//[%s] 文件//[%#] 行号//[%!] 函数//[%v] 实际文本logPtr->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%l] [%t] [%s %!:%#] %v");//设置当出发 err 或更严重的错误时立刻刷新日志到  disklogPtr->flush_on(spdlog::level::trace);//spdlog::flush_every(std::chrono::seconds(3));}auto logger() {return logPtr;}private:std::shared_ptr<spdlog::logger> logPtr;
};#define INITLOG(path)     BaseLog::getInstance()->init(path)
//参见SPDLOG_LOGGER_CALL
#define SPDLOG_BASE(logger, level, ...) (logger)->log(spdlog::source_loc{__FILE__, __LINE__, __func__}, level, __VA_ARGS__)
#define TRACELOG(...)     SPDLOG_BASE(BaseLog::getInstance()->logger(), spdlog::level::trace, __VA_ARGS__)
#define DEBUGLOG(...)     SPDLOG_BASE(BaseLog::getInstance()->logger(), spdlog::level::debug, __VA_ARGS__)
#define INFOLOG(...)      SPDLOG_BASE(BaseLog::getInstance()->logger(), spdlog::level::info, __VA_ARGS__)
#define WARNLOG(...)      SPDLOG_BASE(BaseLog::getInstance()->logger(), spdlog::level::warn, __VA_ARGS__)
#define ERRORLOG(...)     SPDLOG_BASE(BaseLog::getInstance()->logger(), spdlog::level::err, __VA_ARGS__)
#define CRITICALLOG(...)  SPDLOG_BASE(BaseLog::getInstance()->logger(), spdlog::level::critical, __VA_ARGS__)

再贴一个百度出来的:https://blog.csdn.net/et_endeavoring/article/details/86109121

#pragma once
#include "Util.h"#ifdef _WIN32
#define __FILENAME__ (strrchr(__FILE__, '\\') ? (strrchr(__FILE__, '\\') + 1):__FILE__)
#else
#define __FILENAME__ (strrchr(__FILE__, '/') ? (strrchr(__FILE__, '/') + 1):__FILE__)
#endif//定义一个在日志后添加 文件名 函数名 行号 的宏定义
#ifndef suffix
#define suffix(msg)  std::string(msg).append("  <")\.append(__FILENAME__).append("> <").append(__func__)\.append("> <").append(std::to_string(__LINE__))\.append(">").c_str()
//#define suffix(msg)  std::string().append(" File:")\
//        .append(__FILENAME__).append("\", Func:\"").append(__func__)\
//        .append("()\", Line:\"").append(std::to_string(__LINE__)).append("\"").append(msg).c_str()
#endif//在  spdlog.h   之前定义,才有效
#ifndef SPDLOG_TRACE_ON
#define SPDLOG_TRACE_ON
#endif#ifndef SPDLOG_DEBUG_ON
#define SPDLOG_DEBUG_ON
#endif#include <spdlog\spdlog.h>
#include "spdlog/sinks/stdout_color_sinks.h"
#include "spdlog/sinks/basic_file_sink.h"
#include <spdlog\sinks\daily_file_sink.h>class Logger
{public:static Logger& GetInstance() {static Logger m_instance;return m_instance;}auto GetLogger() { return nml_logger; }private:Logger() {util::MakeSureDirExist("logs");//设置为异步日志//spdlog::set_async_mode(32768);  // 必须为 2 的幂std::vector<spdlog::sink_ptr> sinkList;
//#ifdef _CONSOLE
#ifdef _DEBUGauto consoleSink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();consoleSink->set_level(spdlog::level::debug);//consoleSink->set_pattern("[multi_sink_example] [%^%l%$] %v");consoleSink->set_pattern("[%m-%d %H:%M:%S.%e][%^%L%$]  %v");sinkList.push_back(consoleSink);
#endifauto basicSink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("logs/basicSink.txt");basicSink->set_level(spdlog::level::debug);basicSink->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%5l%$]  %v");sinkList.push_back(basicSink);nml_logger = std::make_shared<spdlog::logger>("both", begin(sinkList), end(sinkList));//register it if you need to access it globallyspdlog::register_logger(nml_logger);// 设置日志记录级别
#ifdef _DEBUGnml_logger->set_level(spdlog::level::trace);
#elsenml_logger->set_level(spdlog::level::err);
#endif//设置 logger 格式[%^%L%$]//nml_logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%5l]  %v");//nml_logger->set_pattern("[%Y-%m-%d %H:%M:%S.%e] [%^%5l%$]  %v");//设置当出发 err 或更严重的错误时立刻刷新日志到  disk nml_logger->flush_on(spdlog::level::err);spdlog::flush_every(std::chrono::seconds(3));}~Logger() {spdlog::drop_all();}Logger(const Logger&) = delete;Logger& operator=(const Logger&) = delete;private:std::shared_ptr<spdlog::logger> nml_logger;
};//Logger& operator<<(Logger& log, const char* s);
//Logger& operator<<(Logger& log, const std::string& s);//#define DEBUG Logger::GetInstance()
#define LTrace(msg,...) Logger::GetInstance().GetLogger()->trace(suffix(msg),__VA_ARGS__)
//#define LDebug(msg,...) Logger::GetInstance().GetLogger()->debug(suffix(msg),__VA_ARGS__)
#define LDebug(...) Logger::GetInstance().GetLogger()->debug(__VA_ARGS__)
#define LInfo(...) Logger::GetInstance().GetLogger()->info(__VA_ARGS__)
#define LWarn(...) Logger::GetInstance().GetLogger()->warn(__VA_ARGS__)
#define LError(...) Logger::GetInstance().GetLogger()->error(__VA_ARGS__)
#define LCritical(...) Logger::GetInstance().GetLogger()->critical(__VA_ARGS__)#define criticalif(b, ...)                        \do {                                       \if ((b)) {                             \Logger::GetInstance().GetLogger()->critical(__VA_ARGS__); \}                                      \} while (0)#ifdef WIN32
#define errcode WSAGetLastError()
#endif

spdlog 日志库学习,简易封装相关推荐

  1. spdlog 日志库学习,自定义 sink

    spdlog wiki:https://github.com/gabime/spdlog/wiki 别人的学习笔记:https://www.cnblogs.com/oucsheep/p/8426548 ...

  2. spdlog日志库的封装使用

    文章目录 前言 spdlog的基本使用 spdlog日志库的封装 前言 编码过程中,日志是必要的一个组件,我们选择使用哪个日志库呢? 参考:15 best C++ Logging libraries ...

  3. spdlog日志库说明文档(超详细)

    spdlog日志库说明文档(超详细) spdlog是一个开源.快速.只有头文件的C++11日志库,code地址在https://github.com/gabime/spdlog,基础示例在https: ...

  4. 对xlslib库与libxls库的简易封装

    一.简介 xlslib库是用来创建excel文件.libxls是用来读取excel文件的,在使用C++或者QT语言来设计对excel文件的读取.都需要事先下载这两个库编译成功后再进行程序设计的.之所以 ...

  5. log4j linux如果日志目录不存在,Java日志库学习笔记

    (未完成,待修改) 一.安装Log4j log4j的库文件可以在官方网站下载: 二.log4j.properties的目录搜索规则 在src/目录下创建一个log4j.properties文件,即LC ...

  6. spdlog日志库使用说明

    安装 git clone https://github.com/gabime/spdlog.git cd spdlog && mkdir build cd build cmake .. ...

  7. 日志库EasyLogging++学习系列(3)—— 配置功能

    在前面的文章 <日志库Easylogging++学习系列(1) -- 简要介绍 >中,我们已经初步见识到了 Easylogging++ 日志库强大的配置功能.那么配置文件中各个字段的意义是 ...

  8. go zap日志库的使用,以及封装。

    go zap日志库使用说明 及 封装 1 zap日志的基本使用 1.0 zap简介 1.1 日志介绍 1.2 为什么选择zap日志 1.3 zap的安装 1.4 创建实例-两种类型 1.4.1 Log ...

  9. (1)go web开发之 zap日志库的使用及gin框架配置zap记录日志详细文档讲解分析

    (一)介绍 zap 是go 中比较火的一个日志库,提供不同级别的日志,并且速度快 官方文档: https://pkg.go.dev/go.uber.org/zap#section-readme, 也可 ...

最新文章

  1. centos 7 单用户模式无法重置root密码 解决方法
  2. Spring Boot req中@NotNull, @NotEmpty和@NotBlank之间的区别是什么?
  3. 常用WebService一览表
  4. 使用 ASMCMD 工具管理ASM目录及文件
  5. Java线程之多线程与多进程(1)——以操作系统的角度述说线程与进程
  6. mysql DCL数据控制语言
  7. 在生成.net core 3.0程序时不包含nuget库
  8. zookeeper3.5.x版本启动报错java.io.IOException: No snapshot found, but there are log entries.解决
  9. bootstrap课程4 bootstrap的css样式有哪些内容需要注意
  10. Installing .NET Core on Ubuntu-摘自网络
  11. UUIDGenerator
  12. 【渝粤题库】陕西师范大学163215旅游研究方法与论文写作 作业(专升本)
  13. 【学习笔记】Arduino uno r3 控制led灯闪烁
  14. Elasticsearch(ES)生产集群健康状况为黄色(yellow)的官方详细解释、原因分析和解决方案(实测可用)
  15. openlayers划线、标记点
  16. 英语四六级写作救命万能表达
  17. caffe不支持relu6_caffe cudaSuccess (4 vs. 0) unspecified launch failure
  18. 安卓手机反应慢又卡怎么办_手机反应慢怎么办?轻松让你的安卓手机提速50%
  19. 南昌地铁信息化服务器,南昌地铁1号线信息化建设
  20. ZZULIOJ 1008: 美元和人民币

热门文章

  1. python中的divmod函数_Python中的divmod函数和map函数
  2. vue-cli 打包之后的各种部署问题集中地
  3. 只是可能对有相同的价格控制进行倒记帐(本月S,前月V)
  4. 如何使用Google实现高效搜索
  5. 海驾学车过程全揭秘——第二篇:迷迷糊糊的报名
  6. OpenCV 直线拟合及应用
  7. 【整理】ubuntu ln命令简单学习
  8. 详解!抖音商家主页的“联系我们”入口怎么添加的
  9. 2008年哈佛大学校长在本科生毕业典礼上
  10. 站位参数的使用(后面会有用)