【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 debug
                spdlog::debug("This message should be displayed..");    

                // change log pattern
                spdlog::set_pattern("[%H:%M:%S %z] [%n] [%^---%L---%$] [thread %t] %v");

                // Compile time log levels
                // define SPDLOG_ACTIVE_LEVEL to desired level
                SPDLOG_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);              //设置日志等级为trace
            SPDLOG_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) {


 

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-06 08:44:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-06 08:44:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-06 08:44:02       87 阅读
  4. Python语言-面向对象

    2024-04-06 08:44:02       96 阅读

热门阅读

  1. 久菜盒子|留学|推荐信|综合

    2024-04-06 08:44:02       39 阅读
  2. 基于JAX的二阶优化方法的实践

    2024-04-06 08:44:02       34 阅读
  3. Linux Shell:`xargs`命令

    2024-04-06 08:44:02       42 阅读
  4. 一点点安全资料:漏洞利用知识扩展

    2024-04-06 08:44:02       28 阅读
  5. 设计模式:享元模式案例

    2024-04-06 08:44:02       33 阅读
  6. CSS简单给表格加上细边框

    2024-04-06 08:44:02       33 阅读