【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

相关文章

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

深度解析Nginx日志分析与499状态码问题解决

《深度解析Nginx日志分析与499状态码问题解决》在Web服务器运维和性能优化过程中,Nginx日志是排查问题的重要依据,本文将围绕Nginx日志分析、499状态码的成因、排查方法及解决方案展开讨论... 目录前言1. Nginx日志基础1.1 Nginx日志存放位置1.2 Nginx日志格式2. 499

Go语言编译环境设置教程

《Go语言编译环境设置教程》Go语言支持高并发(goroutine)、自动垃圾回收,编译为跨平台二进制文件,云原生兼容且社区活跃,开发便捷,内置测试与vet工具辅助检测错误,依赖模块化管理,提升开发效... 目录Go语言优势下载 Go  配置编译环境配置 GOPROXYIDE 设置(VS Code)一些基本

小白也能轻松上手! 路由器设置优化指南

《小白也能轻松上手!路由器设置优化指南》在日常生活中,我们常常会遇到WiFi网速慢的问题,这主要受到三个方面的影响,首要原因是WiFi产品的配置优化不合理,其次是硬件性能的不足,以及宽带线路本身的质... 在数字化时代,网络已成为生活必需品,追剧、游戏、办公、学习都离不开稳定高速的网络。但很多人面对新路由器

使用Python构建一个高效的日志处理系统

《使用Python构建一个高效的日志处理系统》这篇文章主要为大家详细讲解了如何使用Python开发一个专业的日志分析工具,能够自动化处理、分析和可视化各类日志文件,大幅提升运维效率,需要的可以了解下... 目录环境准备工具功能概述完整代码实现代码深度解析1. 类设计与初始化2. 日志解析核心逻辑3. 文件处

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

C++ Log4cpp跨平台日志库的使用小结

《C++Log4cpp跨平台日志库的使用小结》Log4cpp是c++类库,本文详细介绍了C++日志库log4cpp的使用方法,及设置日志输出格式和优先级,具有一定的参考价值,感兴趣的可以了解一下... 目录一、介绍1. log4cpp的日志方式2.设置日志输出的格式3. 设置日志的输出优先级二、Window

linux hostname设置全过程

《linuxhostname设置全过程》:本文主要介绍linuxhostname设置全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录查询hostname设置步骤其它相关点hostid/etc/hostsEDChina编程A工具license破解注意事项总结以RHE

Python设置Cookie永不超时的详细指南

《Python设置Cookie永不超时的详细指南》Cookie是一种存储在用户浏览器中的小型数据片段,用于记录用户的登录状态、偏好设置等信息,下面小编就来和大家详细讲讲Python如何设置Cookie... 目录一、Cookie的作用与重要性二、Cookie过期的原因三、实现Cookie永不超时的方法(一)

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.