如何截断boost日志格式表达式

时间:2015-01-09 22:11:11

标签: c++ boost boost-log

通常,如何在boost日志格式表达式上执行字符串操作?特别是,如何截断以小数秒结束的TimeStamp表达式,以便记录毫秒而不是微秒?

鉴于此片段,我如何记录,例如13:13:08.440而不是13:13:08.440736?

logging::add_file_log("xyz.log",
    keywords::format = expr::stream
        << expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%T.%f")
);

我想做这样的事情:

<< expr::format_date_time<boost::posix_time::ptime>("TimeStamp", "%T.%.3f")

1 个答案:

答案 0 :(得分:1)

目前Boost.Log中没有内置此功能。但是,您可以编写自己的格式化函数并将其设置为Boost.Log接收器的格式化程序。您可以创建一个将整个记录格式化的函数(例如,参见here),也可以只为特定属性定义operator<<Here就是一个例子。另请注意,Boost.Log表达式基于Boost.Phoenix,因此在过滤器和格式化程序中使用Boost.Phoenix构造也是可能的。例如:

std::string my_formatter(logging::value_ref< boost::posix_time::ptime > const& timestamp)
{
    if (timestamp)
    {
        // Format date/time here and return the result.
    }
    else
    {
        // The "TimeStamp" attribute value was not found or has unexpected type.
        // Return a placeholder string.
    }
}

logging::add_file_log("xyz.log",
    keywords::format = expr::stream
        << boost::phoenix::bind(&my_formatter, expr::attr<boost::posix_time::ptime>("TimeStamp"))
);