C++11 Boost日志未在共享对象代码中显示命名范围
我正在使用boostlog(v1.71)尝试编写日志。我们的体系结构涉及一组动态加载的共享对象,在共享对象中使用命名范围属性时遇到了问题 我正在我们的一个support util库中设置一个全局记录器,其中包含logger.hh和logger.cxx:C++11 Boost日志未在共享对象代码中显示命名范围,c++11,logging,boost,C++11,Logging,Boost,我正在使用boostlog(v1.71)尝试编写日志。我们的体系结构涉及一组动态加载的共享对象,在共享对象中使用命名范围属性时遇到了问题 我正在我们的一个support util库中设置一个全局记录器,其中包含logger.hh和logger.cxx: //logger.hh #include <boost/log/trivial.hpp> // etc. BOOST_LOG_GLOBAL_LOGGER(my_logger, src::severity_logger_mt<
//logger.hh
#include <boost/log/trivial.hpp>
// etc.
BOOST_LOG_GLOBAL_LOGGER(my_logger, src::severity_logger_mt<trivial::severity_level>)
#define LOG_TRACE BOOST_LOG_SEV(my_logger::get(), trace)
// etc...
有人能帮我理解我需要做什么才能让命名的作用域工作吗?我理解这里的用例是不寻常的,但我更愿意在整个程序之间共享单个全局记录器
在RHEL7上使用GCC4.8.3。我通过在支持共享对象库中添加一个名为BOOST\u LOG\u SCOPE的宏调用,成功地解决了这个问题。似乎不需要其他改变。我不太明白为什么这样做可以解决这个问题,但它确实解决了。请确保您正在链接Boost.Log的共享库。如果这没有帮助,请提供一个最小的可编译复制。我已经设法解决了这个问题,似乎不需要链接到共享库。我们可能会在某个时候交换到共享库,但现在由于我们的代码是功能性的,我们将保留它。这就是为什么我建议您链接Boost.Log的共享库。只有在单个模块(共享库或可执行文件)中使用Boost.Log时,才支持静态库。Boost.Log在内部维护许多单例,因此当您在多个模块中静态链接时,这些单例会被复制,您可能会遇到任何类型的错误行为。是的,我会记住这一点。我们很可能很快就会转换。
//logger.cxx
BOOST_LOG_GLOBAL_LOGGER_INIT(my_logger, src::severity_logger_mt<trivial::severity_level>)
{
src::severity_logger_mt<trivial::severity_level> lg;
lg.add_attribute("Scope", boost::log::attributes::named_scope());
return lg;
}
//main.cxx
#include "logger.hh"
int main()
{
logging::formatter fmt = expr::stream
<< expr::format_named_scope("Scope", keywords::format = "%n") << " - " << expr::message;
logging::add_console_log(std::clog, keywords::format = fmt);
BOOST_LOG_NAMED_SCOPE("main");
LOG_WARNING << "test log";
// Main code continues, including dynamically loading plugin shared objects.
}
//plugin.cxx
void Activity()
{
BOOST_LOG_NAMED_SCOPE("Activity");
LOG_WARNING << "activity log";
}
main - test log
- activity log