说明文档里有些要点不写清楚,害我查阅半天资料。
使用包含所在文件和函数的自定义输出格式
分两步。分别要设置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里小章节里提一句……还得把所有日志代码完全重写……
——很生气的博主
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)
图片中代码和文中代码有微小区别,没影响。
文章评论