如何从程序中删除日志调试语句
How to remove log debugging statements from a program
我使用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_SEV
为boost::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
@MartinShobe的接受答案适用于:
- g++(4.7.2)与
-O1
及更高版本 - clang++ (3.4) with
-O2
及以上 - Visual Studio(2008)带有链接标志
/OPT:REF
接受的答案不适合我(MSVC 2019, stdc++17)。
我的解决方案有点古怪。但是优化一定要考虑到这一点:
<>之前# ifdef NDEBUG#define LOG_DEBUG if (false) std::cout其他##define LOG_DEBUG if (true) std::cout# endif之前用法:<>之前LOG_DEBUG & lt; & lt;... & lt; & lt;std:: endl;
关闭程序中的所有优化并加快编译速度。
/Oddiv或boot_log_stop
相关文章:
- 当回溯以零开始时,如何调试崩溃
- 在linux上调试巨大的C++项目
- 为什么使用__LINE_的代码在发布模式下在MSVC下编译,而不是在调试模式下
- 如何针对特定情况调试和修复此双自由内存损坏问题
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 正在VS调试器中监视映射条目
- 使用调试/崩溃报告将应用程序部署到客户端
- 执行调试日志记录的更好方法
- 从 Tableau 调用 Rcpp 函数时出错.如何解释和调试 Rserve 日志
- Poco::Logger 不记录跟踪或调试级别日志,只记录信息级别及以上
- Valgrind调试日志:大小为8的读取无效
- log4cplus在Visual Studio调试控制台中进行日志记录
- 调试日志语句的预处理器宏在C++中有一席之地吗
- NDK如何在发布时删除日志调试语句
- 我怎么能用C++在非越狱的ios设备上写调试日志呢
- windows上的c++调试日志
- 创建一个简单的窗口来输出用于调试的信息(日志样式)- wxWidgets
- Android -跨平台友好的调试/日志宏
- 如何从程序中删除日志调试语句
- 如何在项目中实现良好的调试/日志记录功能