C++11 Boost日志未在共享对象代码中显示命名范围

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<

我正在使用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<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