wking's blog

  • IT技术
  • 系统封装
  • 大航海时代
  • 日常随笔
  • 关于博客
GOD'S IN HIS HEAVEN, ALL'S RIGHT WITH THE WORLD.
  1. 首页
  2. IT技术
  3. C++
  4. 正文

C++ spdlog库使用要点记录

2023-02-01 146点热度 0人点赞 0条评论

说明文档里有些要点不写清楚,害我查阅半天资料。

使用包含所在文件和函数的自定义输出格式

分两步。分别要设置SPDLOG_ACTIVE_LEVEL宏,以及要使用时也必须使用宏。

第一步 定义日志显示级别宏

必须在#include <spdlog/spdlog.h>前,插入#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE。官方说明在(https://github.com/gabime/spdlog/wiki/0.-FAQ#how-to-remove-all-debug-statements-at-compile-time-),SPDLOG_ACTIVE_LEVEL宏的作用为比TRACE级别低的日志则不显示。由于想要自定义输出格式中包含日志所在文件和函数功能的话,就必须用宏写日志代码,而这个显示级别宏默认是info级别,比info级别低的日志就不显示,所以这个显示级别宏一定要定义。

当要发布解决方案时,把SPDLOG_ACTIVE_LEVEL宏的级别提高即可。

spdlog定义的日志级别由低到高分别是:

  • #define SPDLOG_LEVEL_TRACE 0
  • #define SPDLOG_LEVEL_DEBUG 1
  • #define SPDLOG_LEVEL_INFO 2
  • #define SPDLOG_LEVEL_WARN 3
  • #define SPDLOG_LEVEL_ERROR 4
  • #define SPDLOG_LEVEL_CRITICAL 5
  • #define SPDLOG_LEVEL_OFF 6

第二步 自定义日志对象显示格式并用宏写所有日志代码

根据官方文档自定义日志输出格式,可包含当前日志消息产生的文件、函数和行数。另外,如果要包含消息产生的文件or函数or行数,则必须用官方定义的宏来写日志命令,不能用::debug()这种方式。如果不想包含文件or函数or行数,那就用::debug()方式即可。

这点真TM坑啊,issue里很多人在问怎么用,但官方readme里不说,只在WIKI里小章节里提一句……还得把所有日志代码完全重写……

——很生气的博主
自定义输出格式
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#define SPDLOG_ACTIVE_LEVEL SPDLOG_LEVEL_TRACE
 
#include <spdlog/spdlog.h>
#include <spdlog/sinks/stdout_color_sinks.h>
 
auto console = spdlog::stdout_color_mt("console");
spdlog::get("console")->set_level(spdlog::level::trace);  // 设置为trace级别,只影响::debug()方式
spdlog::get("console")->set_pattern("[%Y-%m-%d %H:%M:%S.%e][%n][%^%l%$][%#@%s::%!] %v"); //设置日志输出格式
SPDLOG_LOGGER_TRACE(console, "Some TRACE message here..");
SPDLOG_LOGGER_DEBUG(console, "Some DEBUG message here..");
SPDLOG_LOGGER_INFO(console, "Some INFO message here..");
SPDLOG_LOGGER_WARN(console, "Some WARN message here..");
SPDLOG_LOGGER_ERROR(console, "Some ERROR message here..");
SPDLOG_LOGGER_CRITICAL(console, "Some CRITICAL message here..");
 
// 作为对比
spdlog::get("console")->trace("test");
spdlog::get("console")->debug("test");
spdlog::get("console")->info("test");
spdlog::get("console")->warn("test");
spdlog::get("console")->error("test");
spdlog::get("console")->critical("test");

用::debug()方式和宏命令方式的效果对比图

可以看到,只有用SPDLOG_LOGGER_宏写日志,才能正常输出消息所在的文件、函数、行数。SPDLOG_LOGGER_宏本身支持format格式,比如SPDLOG_LOGGER_DEBUG(console, "debug arg1={1}, arg2={0}", arg2, arg1)

图片中代码和文中代码有微小区别,没影响。

用::debug()方式和宏命令方式的效果对比图
本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: 暂无
最后更新:2023-02-01

wking

不管博客型博主

点赞
< 上一篇
下一篇 >

文章评论

razz evil exclaim smile redface biggrin eek confused idea lol mad twisted rolleyes wink cool arrow neutral cry mrgreen drooling persevering
取消回复

目录
  • 使用包含所在文件和函数的自定义输出格式
    • 第一步 定义日志显示级别宏
    • 第二步 自定义日志对象显示格式并用宏写所有日志代码
    • 用::debug()方式和宏命令方式的效果对比图
标签聚合
一支红杏 大航海时代 wordpress win10 内存 R6300V2 OneNote linux

COPYRIGHT © 2023 wkings.blog. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang