【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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一

golang 日志log与logrus示例详解

《golang日志log与logrus示例详解》log是Go语言标准库中一个简单的日志库,本文给大家介绍golang日志log与logrus示例详解,感兴趣的朋友一起看看吧... 目录一、Go 标准库 log 详解1. 功能特点2. 常用函数3. 示例代码4. 优势和局限二、第三方库 logrus 详解1.

PyCharm如何设置新建文件默认为LF换行符

《PyCharm如何设置新建文件默认为LF换行符》:本文主要介绍PyCharm如何设置新建文件默认为LF换行符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录PyCharm设置新建文件默认为LF换行符设置换行符修改换行符总结PyCharm设置新建文件默认为LF

如何自定义Nginx JSON日志格式配置

《如何自定义NginxJSON日志格式配置》Nginx作为最流行的Web服务器之一,其灵活的日志配置能力允许我们根据需求定制日志格式,本文将详细介绍如何配置Nginx以JSON格式记录访问日志,这种... 目录前言为什么选择jsON格式日志?配置步骤详解1. 安装Nginx服务2. 自定义JSON日志格式各

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

SpringBoot项目使用MDC给日志增加唯一标识的实现步骤

《SpringBoot项目使用MDC给日志增加唯一标识的实现步骤》本文介绍了如何在SpringBoot项目中使用MDC(MappedDiagnosticContext)为日志增加唯一标识,以便于日... 目录【Java】SpringBoot项目使用MDC给日志增加唯一标识,方便日志追踪1.日志效果2.实现步

SQL Server清除日志文件ERRORLOG和删除tempdb.mdf

《SQLServer清除日志文件ERRORLOG和删除tempdb.mdf》数据库再使用一段时间后,日志文件会增大,特别是在磁盘容量不足的情况下,更是需要缩减,以下为缩减方法:如果可以停止SQLSe... 目录缩减 ERRORLOG 文件(停止服务后)停止 SQL Server 服务:找到错误日志文件:删除

Ubuntu中Nginx虚拟主机设置的项目实践

《Ubuntu中Nginx虚拟主机设置的项目实践》通过配置虚拟主机,可以在同一台服务器上运行多个独立的网站,本文主要介绍了Ubuntu中Nginx虚拟主机设置的项目实践,具有一定的参考价值,感兴趣的可... 目录简介安装 Nginx创建虚拟主机1. 创建网站目录2. 创建默认索引文件3. 配置 Nginx4

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx