elv*_*kaj 5 c++ logging boost-log
我需要一个用于调试目的的记录器,我正在使用Boost.Log(1.54.0和boost.org主页中的补丁).
一切都很好我已经创建了一些像这样的宏:
#define LOG_MESSAGE( lvl ) BOOST_LOG_TRIVIAL( lvl )
Run Code Online (Sandbox Code Playgroud)
现在这是一种只在调试模式下在BOOST_LOG_TRIVIAL(lvl)中显示LOG_MESSAGE(lvl)并在发布中忽略的方法吗?
例如:
LOG_MESSAGE( critical ) << "If I read this message we're in debug mode"
Run Code Online (Sandbox Code Playgroud)
编辑 我的第一次尝试是创建一个nullstream ...我认为在发布模式编译器将优化它...
#if !defined( NDEBUG )
#include <boost/log/trivial.hpp>
#define LOG_MESSAGE( lvl ) BOOST_LOG_TRIVIAL( lvl )
#else
#if defined( __GNUC__ )
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-value"
#endif
#include <iosfwd>
struct nullstream : public std::ostream {
nullstream() : std::ios(0), std::ostream(0) {}
};
static nullstream g_nullstream;
#define LOG_MESSAGE( lvl ) g_nullstream
#if defined( __GNUC__ )
#pragma GCC diagnostic pop
#endif
#endif
Run Code Online (Sandbox Code Playgroud)
日志条目的严重性级别仅作为接收器的过滤器.接收器将根据严重性级别决定如何处理消息(打印与否).但是仍然会发送消息.
如果你试图根本不发送消息,那么你需要重新定义LOG_MESSAGE实际上什么都不做的事情.Boost库中可能有一些东西,否则,你必须自己编写.也许这将是一个开始:
class NullLogger
{
public:
template <typename SeverityT> NullLogger (SeverityT) {};
template <typename Val> NullLog& operator<< (const Val&) { return * this};
};
Run Code Online (Sandbox Code Playgroud)
...然后:
#define LOG_MESSAGE (lvl) NullLogger (lvl)
Run Code Online (Sandbox Code Playgroud)
但请注意,即使没有对日志消息或构成它的表达式进行任何操作,仍会评估表达式.如果其中一些表达式很昂贵,您仍然会受到性能影响.例如:
LOG_MESSAGE (debug) << SomeSuperExpensiveFunction();
Run Code Online (Sandbox Code Playgroud)
即使您使用NullLogger上述内容,SomeSuperExpensiveFunction()仍然会被调用.
我建议作为一种替代补充说,在运行时计算的标志,并决定在运行时是否没有做记录:
if (mLogStuff)
{
LOG_MESSAGE (debug) << SomeSuperExpensiveFunction();
}
Run Code Online (Sandbox Code Playgroud)
boolean比较超级便宜,你可能会发现将来有一天能够打开和关闭登录的能力非常方便.此外,这样做意味着您不需要添加另一个#define,这总是一件好事.