【spdlog学习】【issue】#2975-编译时设置宏定义SPDLOG_ACTIVE_LEVEL对日志等级的影响

本文主要是介绍【spdlog学习】【issue】#2975-编译时设置宏定义SPDLOG_ACTIVE_LEVEL对日志等级的影响,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

【网络链接】issue

问题的大概意思是,下面的代码没有按照楼主的预期输出日志

            /*代码*/#include "spdlog/spdlog.h"int main() {spdlog::info("Welcome to spdlog!");spdlog::error("Some error message with arg: {}", 1);spdlog::warn("Easy padding in numbers like {:08d}", 12);spdlog::critical("Support for int: {0:d};  hex: {0:x};  oct: {0:o}; bin: {0:b}", 42);spdlog::info("Support for floats {:03.2f}", 1.23456);spdlog::info("Positional args are {1} {0}..", "too", "supported");spdlog::info("{:<30}", "left aligned");spdlog::set_level(spdlog::level::debug); // Set global log level to debugspdlog::debug("This message should be displayed..");    // change log patternspdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");// Compile time log levels// define SPDLOG_ACTIVE_LEVEL to desired levelSPDLOG_TRACE("Some trace message with param {}", 42);SPDLOG_DEBUG("Some debug message");}/*编译命令g++ -I include -std=c++11 -O0 -g -DSPDLOG_ACTIVE_LEVEL=SPDLOG_LEVEL_TRACE -o spdlog-main ./spdlog-main.cc*//*日志输出结果这一条日志没有正常输出,其他输出正常SPDLOG_TRACE("Some trace message with param {}", 42); */

 

楼主分析代码的过程还是挺厉害的,先进行预编译观察宏定义是否替换成功。然后再用gdb去跟踪代码观察输出逻辑。最后发现,需要在输出前进行日志等级设置,才能正常输出。

            spdlog::set_level(spdlog::level::trace);              //设置日志等级为traceSPDLOG_TRACE("Some trace message with param {}", 42);

在这个issue下面,也有大佬解释了

      The logging macro SPDLOG_TRACE is a macro to remove unnecessary logging statements by SPDLOG_ACTIVE_LEVEL which was defined at compile time, so the current behavior is as specified.SPDLOG_TRACE这个宏,依据SPDLOG_ACTIVE_LEVEL的值删除不必要的日志语句,而SPDLOG_ACTIVE_LEVEL是在编译时定义的,所以当前的行为是指定的【TODO 最后这半句没懂】。The examples in the Basic usage section of README.md are certainly confusing.这个代码示例来自README中的Basic usage,确实使人困惑。

也就是说编译时设置SPDLOG_ACTIVE_LEVEL并不会影响代码中spdlog::set_level设置的日志等级。

我也去找了找源码看看,确实很难看啊,就当看小说一样了解一下,千万别想着全看明白。

       //SPDLOG_TRACE的定义#if SPDLOG_ACTIVE_LEVEL <= SPDLOG_LEVEL_TRACE#define SPDLOG_LOGGER_TRACE(logger, ...) \SPDLOG_LOGGER_CALL(logger, spdlog::level::trace, __VA_ARGS__)#define SPDLOG_TRACE(...) SPDLOG_LOGGER_TRACE(spdlog::default_logger_raw(), __VA_ARGS__)#else //在SPDLOG_ACTIVE_LEVEL > SPDLOG_LEVEL_TRACE的情况下,宏定义就是不执行#define SPDLOG_LOGGER_TRACE(logger, ...) (void)0#define SPDLOG_TRACE(...) (void)0#endif//底层日志是否输出的逻辑判断SPDLOG_INLINE void logger::set_level(level::level_enum log_level) { level_.store(log_level); }// return true logging is enabled for the given level.bool should_log(level::level_enum msg_level) const {return msg_level >= level_.load(std::memory_order_relaxed); //level_这个值会被 spdlog::set_level 修改}template <typename... Args>void log_(source_loc loc, level::level_enum lvl, string_view_t fmt, Args &&...args) {bool log_enabled = should_log(lvl);  //这块进行了比较日志等级比较决定 log_enabled bool traceback_enabled = tracer_.enabled();if (!log_enabled && !traceback_enabled) {


 

这篇关于【spdlog学习】【issue】#2975-编译时设置宏定义SPDLOG_ACTIVE_LEVEL对日志等级的影响的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/870094

相关文章

Nginx设置连接超时并进行测试的方法步骤

《Nginx设置连接超时并进行测试的方法步骤》在高并发场景下,如果客户端与服务器的连接长时间未响应,会占用大量的系统资源,影响其他正常请求的处理效率,为了解决这个问题,可以通过设置Nginx的连接... 目录设置连接超时目的操作步骤测试连接超时测试方法:总结:设置连接超时目的设置客户端与服务器之间的连接

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Spring Boot整合log4j2日志配置的详细教程

《SpringBoot整合log4j2日志配置的详细教程》:本文主要介绍SpringBoot项目中整合Log4j2日志框架的步骤和配置,包括常用日志框架的比较、配置参数介绍、Log4j2配置详解... 目录前言一、常用日志框架二、配置参数介绍1. 日志级别2. 输出形式3. 日志格式3.1 PatternL

CSS弹性布局常用设置方式

《CSS弹性布局常用设置方式》文章总结了CSS布局与样式的常用属性和技巧,包括视口单位、弹性盒子布局、浮动元素、背景和边框样式、文本和阴影效果、溢出隐藏、定位以及背景渐变等,通过这些技巧,可以实现复杂... 一、单位元素vm 1vm 为视口的1%vh 视口高的1%vmin 参照长边vmax 参照长边re

Windows设置nginx启动端口的方法

《Windows设置nginx启动端口的方法》在服务器配置与开发过程中,nginx作为一款高效的HTTP和反向代理服务器,被广泛应用,而在Windows系统中,合理设置nginx的启动端口,是确保其正... 目录一、为什么要设置 nginx 启动端口二、设置步骤三、常见问题及解决一、为什么要设置 nginx

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错

开启mysql的binlog日志步骤详解

《开启mysql的binlog日志步骤详解》:本文主要介绍MySQL5.7版本中二进制日志(bin_log)的配置和使用,文中通过图文及代码介绍的非常详细,需要的朋友可以参考下... 目录1.查看是否开启bin_log2.数据库会把日志放进logs目录中3.查看log日志总结 mysql版本5.71.查看

vue基于ElementUI动态设置表格高度的3种方法

《vue基于ElementUI动态设置表格高度的3种方法》ElementUI+vue动态设置表格高度的几种方法,抛砖引玉,还有其它方法动态设置表格高度,大家可以开动脑筋... 方法一、css + js的形式这个方法需要在表格外层设置一个div,原理是将表格的高度设置成外层div的高度,所以外层的div需要