【发布时间】: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_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 常量?
【问题讨论】: