我正在尝试使用带有Boost.Log的自定义格式器。我知道如何执行此操作的set_formatter
方法是调用接收器的方法,为它提供本地函数的地址,其中本地函数的签名需要为:
void my_formatter(boost::log::record_view const& rec, boost::log::formatting_ostream& strm)
在其中,my_formatter
我可以使用Boost.Log提取API来获取所需的属性值。获得值后,可以将其输出到strm
。我想这样做,所以我可以轻松地格式化记录中存储的一些自定义属性。但是对于其他更常规的Boost.Log属性,我想继续使用作为该set_formatter
方法的关键字参数记录的简单格式表达式。有没有办法在my_formatter
自定义函数中也使用关键字表达式?
例如:
void my_formatter(boost::log::record_view const& rec, boost::log::formatting_ostream& strm)
{
// here I can get the timestamp attribute and format its ticks value to the stream
boost::log::value_ref<boost::posix_time::ptime> tstamp_ref =
boost::log::extract<boost::posix_time::ptime>("TimeStamp", rec);
const boost::posix_time::ptime& timestamp = tstamp_ref.get();
strm << timestamp.time_of_day().ticks();
}
然后给一个水槽,我可以打电话给
sink->set_formatter(&my_formatter)
但是Boost.Log给了我一个优雅的(几乎是神奇的)表达式,我可以用它来设置格式化程序:
boost::log::formatter formatter =
expr::stream
<< expr::format_date_time<boost::posix_time::ptime>(
"TimeStamp", "%Y/%m/%d, %H:%M:%S.%f, ");
sink->set_formatter(formatter)
我的问题是:有没有办法在我的自定义my_formatter
函数中使用格式化程序表达式?
谢谢!
您可能想要做的是将格式化程序的自定义部分注入到使用Boost.Log创建的格式化表达式中,而不是相反。此答案描述了一种通过使用来实现此目标的方法phoenix::bind
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句