【问题标题】:How to remove log debugging statements from a program如何从程序中删除日志调试语句
【发布时间】:2013-04-08 07:36:15
【问题描述】:

我正在使用boost::log 作为我的 C++ 程序的记录器。 在开发过程中我经常这样使用,例如:

#define LOG(severity) BOOST_LOG_SEV(boost::logger::get(), (severity))
#define LOG_ERR LOG(Severity::error)
#define LOG_INFO LOG(Severity::info)
#define LOG_DEBUG LOG(Severity::debug)

其中BOOST_LOG_SEVboost::log提供的设施,而LOGLOG_ERRORLOG_INFOLOG_DEBUG是我定义的快捷方式。

简而言之,BOOST_LOG_SEV 动态地将当前调试严重性与传递给宏本身的严重性进行比较,以决定是否发出输出。

这是一个使用上述宏进行调试的程序示例:

// set at compile time
#define MAX_LOG_SEVERITY Severity::debug

int main() {
   // Print all the messages with a
   // Severity <= MAX_LOG_SEVERITY defined before compiling
   boost::log::set_severity(boost::logger::get(), MAX_LOG_SEVERITY); // set_severity() is fictitious just to give you an idea

   // bool err = ...
   if (err)
      LOG_ERR << "An error occurred";
   else 
      LOG_INFO << "Okay;
   LOG_DEBUG << "main() called";
}

现在,在为生产环境发布程序时,使用Severity::debug 级别的调试消息实际上没有任何意义。我可以通过简单地将MAX_LOG_SEVERITY 减少到Severity::info 将它们从输出中隐藏,但问题是LOG_DEBUG 进行的调用不会从可执行代码中删除。这对效率和对象大小都有不良影响。

代码中充满了日志语句,我真的很想保留operator&lt;&lt;() 的简单用法。

在不触及这些语句本身的情况下,LOG_DEBUG 是否有更好的宏定义/技巧可以使预处理器或编译器(在其优化期间)在MAX_LOG_SEVERITY 时“跳过”或“删除”调试语句设置为Severity::debug 常量?

【问题讨论】:

    标签: c++ logging boost


    【解决方案1】:

    虽然我无法做出任何保证,但这样的事情可能会奏效。这取决于您的优化器所做的事情以及您对 operator 的参数是否有副作用

    #ifdef NO_LOG_DEBUG
    
    static class DevNull
    {
    } dev_null;
    
    template <typename T>
    DevNull & operator<<(DevNull & dest, T)
    {
        return dest;
    }
    
    #define LOG_DEBUG dev_null
    
    #else
    
    #define LOG_DEBUG LOG(Severity::debug)
    
    #endif
    

    【讨论】:

      【解决方案2】:

      @MartinShobe 接受的答案适用于:

      • g++ (4.7.2) 和 -O1 及更高版本
      • clang++ (3.4) 和 -O2 及更高版本
      • 带有链接器标志/OPT:REF的Visual Studio (2008)

      【讨论】:

        【解决方案3】:

        接受的答案对我不起作用(MSVC 2019,stdc++17)。

        我的解决方案有点古怪。但是优化肯定会处理它:

        #ifdef NDEBUG #define LOG_DEBUG if (false) std::cout #别的 #define LOG_DEBUG if (true) std::cout #万一

        用法:

        LOG_DEBUG

        【讨论】:

          【解决方案4】:

          关闭程序中的所有优化并加快编译速度。

          /Od 或 boot_log_stop

          【讨论】:

            猜你喜欢
            • 2016-04-08
            • 2013-10-01
            • 2012-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-07
            相关资源
            最近更新 更多