如何解决Boost日志未在共享对象代码中显示命名范围
我正在使用增强日志(v1.71)尝试编写日志。我们的体系结构涉及一组动态加载的共享对象,在共享对象中使用named的作用域属性时遇到了麻烦。
我正在其中一个支持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...
和
//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.
}
最后在共享库插件中,链接到util库:
//plugin.cxx
void Activity()
{
BOOST_LOG_NAMED_SCOPE("Activity");
LOG_WARNING << "activity log";
}
我对此有很多解释,但希望所有关键要素都在这里。当前,运行该程序的输出如下:
main - test log
- activity log
任何人都可以帮助我了解如何使命名作用域正常工作吗?我赞赏这里的用例很特殊,但我希望在整个程序之间共享单个全局记录器。
在RHEL7上使用gcc 4.8.3。
解决方法
我设法通过将BOOST_LOG_NAMED_SCOPE宏调用添加到支持共享库中解决了该问题。似乎不需要其他更改。我不特别了解为什么这可以解决问题,但确实可以解决。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。