gpt4 book ai didi

c++ - 如何从程序中删除日志调试语句

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:25:20 25 4
gpt4 key购买 nike

我正在使用 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提供的设施吗? , 而 LOG , LOG_ERROR , LOG_INFO , LOG_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<<() 的简单用法。 .

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

最佳答案

虽然我不能做出任何保证,但这样的事情可能会奏效。这取决于你的优化器做了什么,以及你是否对 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

关于c++ - 如何从程序中删除日志调试语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16027876/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com