我试图将可读名称设置为Boost记录器的线程而不是十六进制线程ID。以下是它现在的样子:
sink->set_formatter(
boost::log::expressions::stream << std::setw(5) <<
boost::log::expressions::attr <unsigned int>("LineID")
<< " [" << boost::log::expressions::format_date_time <boost::posix_time::ptime>("TimeStamp", "%H:%M:%S.%f")
<< "] <" << boost::log::expressions::attr <Severity_Level>("Severity")
<< "> (" << boost::log::expressions::attr <boost::log::attributes::current_thread_id::value_type> ("ThreadID")
<< ") " << boost::log::expressions::smessage);
我的第一个想法是制作地图容器或以某种方式使用pthread_setname_np。但问题是如何将其插入到boost记录结构中。有没有办法正确地做到这一点?
答案 0 :(得分:1)
您可以使用线程名称添加特定于线程的属性。
BOOST_LOG_ATTRIBUTE_KEYWORD(a_thread_name, "ThreadName", std::string)
void thread_entry()
{
boost::log::core::get()->add_thread_attribute("ThreadName",
boost::log::attributes::constant< std::string >("My thread name"));
// Your thread logic follows
}
这通常在您的线程启动函数中完成。
您可以在过滤器和格式化程序中使用此属性,方法与任何其他属性相同。例如:
sink->set_formatter(
boost::log::expressions::stream << std::setw(5) <<
boost::log::expressions::attr <unsigned int>("LineID")
<< " [" << boost::log::expressions::format_date_time <boost::posix_time::ptime>("TimeStamp", "%H:%M:%S.%f")
<< "] <" << boost::log::expressions::attr <Severity_Level>("Severity")
<< "> (" << boost::log::expressions::attr <boost::log::attributes::current_thread_id::value_type> ("ThreadID")
<< ", " << a_thread_name
<< ") " << boost::log::expressions::smessage);
您可以从文档中了解有关thread-specific attributes,attribute keywords和constant
attribute的详情。