c++ - 为 boost logger 设置线程名称

标签 c++ multithreading logging boost

我正在尝试为 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);

我的第一个想法是制作一个 map 容器或以某种方式使用 pthread_setname_np。但问题是如何将其插入到 boost 日志结构中。有什么办法可以正确地做到这一点?

最佳答案

您可以使用线程名称添加特定于线程的属性。

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 keywordsconstant attribute来自文档。

关于c++ - 为 boost logger 设置线程名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45212100/

相关文章:

c++ - std::forward 如何接收正确的参数?

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

java - JAVA 日志记录的最佳方法/性能是什么?字符串或 StringBuilder 或 StringBuffer

c# - 如何将Azure Function日志发送到blob存储?

c++ - 在 C++ 中将 char 转换为 int

c++ - 将负索引包装到数组的大小

java - ConcurrentHashMap 作为具有同步的单例缓存

java - 用Java解析文本文件的良好实践

c++ - 由于纹理分配错误,在 Openframeworks(C++) 中无法初始化 Thread 类中的 OfImage 对象

c# - 如何优化读取访问?