C++ Boost.Log中缺少时间戳
我是Boost.Log的新手。我想按以下格式打印数据:C++ Boost.Log中缺少时间戳,c++,boost,boost-log,C++,Boost,Boost Log,我是Boost.Log的新手。我想按以下格式打印数据: [时间戳][严重性]消息 我有这样的密码 auto my_formatter = [](boost::log::record_view const& rec, boost::log::formatting_ostream& strm) { strm << "[" << boost::log::expressions::format_date_time< boost::posix_time
[时间戳][严重性]消息
我有这样的密码
auto my_formatter = [](boost::log::record_view const& rec, boost::log::formatting_ostream& strm)
{
strm << "[" << boost::log::expressions::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S") << "]";
strm << "[" << rec[boost::log::trivial::severity] << "] ";
strm << rec[boost::log::expressions::smessage];
};
void addFileSink()
{
using sinkType = boost::log::sinks::synchronous_sink<boost::log::sinks::text_file_backend>;
auto backend = boost::make_shared<boost::log::sinks::text_file_backend>(
boost::log::keywords::file_name = "log_%N.log",
boost::log::keywords::rotation_size = 10 * 1024 * 1024,
boost::log::keywords::open_mode = std::ios_base::app
);
boost::shared_ptr<sinkType> sink(new sinkType(backend));
sink->set_formatter(my_formatter);
sink->set_filter(boost::log::trivial::severity >= boost::log::trivial::severity_level::info);
boost::log::core::get()->add_sink(sink);
}
void addConsoleSink()
{
using sinkType = boost::log::sinks::synchronous_sink<boost::log::sinks::text_ostream_backend>;
auto backend = boost::make_shared<boost::log::sinks::text_ostream_backend>();
backend->add_stream(boost::shared_ptr<std::ostream>(&std::cout, boost::null_deleter()));
backend->auto_flush(true);
boost::shared_ptr<sinkType> sink(new sinkType(backend));
sink->set_formatter(my_formatter);
sink->set_filter(boost::log::trivial::severity >= boost::log::trivial::severity_level::error);
boost::log::core::get()->add_sink(sink);
}
int main()
{
boost::log::add_common_attributes();
addFileSink();
addConsoleSink();
boost::log::sources::severity_logger<boost::log::trivial::severity_level> lg;
BOOST_LOG_SEV(lg, boost::log::trivial::severity_level::error) << "Message error";
BOOST_LOG_SEV(lg, boost::log::trivial::severity_level::info) << "Message info";
return 0;
}
auto my_formatter=[](boost::log::record_view const&rec,boost::log::formatting_ostream&strm)
{
strm自动刷新(真);
boost::共享的ptr接收器(新的sinkType(后端));
接收器->设置格式化程序(我的格式化程序);
sink->set_filter(boost::log::trival::severity>=boost::log::trival::severity_level::error);
boost::log::core::get()->add_sink(sink);
}
int main()
{
boost::log::添加公共属性();
addFileSink();
addConsoleSink();
boost::log::sources::severity\u logger lg;
BOOST_LOG_SEV(lg,BOOST::LOG::Trial::severity_level::error)BOOST::LOG::expressions::format_date_time
不是格式化日期和时间的函数。它是用于lambda格式化表达式的格式化程序生成器。换句话说,format_date_time
创建格式化程序(具有特定签名的函数对象),调用时,将从日志记录中提取属性值并对其进行格式化
您应该使用lambda表达式来构建格式化程序,而不是使用my\u formatter
函数,在这种情况下,您可以使用format\u date\u time
,或者使用格式化日期和时间的传统方法之一,如或
使用lambda表达式的示例:
namespace expr = boost::log::expressions;
sink->set_formatter
(
expr::stream
<< "[" << expr::format_date_time< boost::posix_time::ptime >("TimeStamp", "%Y-%m-%d %H:%M:%S") << "]"
<< "[" << boost::log::trivial::severity << "] "
<< expr::smessage
);
auto my_formatter = [](boost::log::record_view const& rec, boost::log::formatting_ostream& strm)
{
if (auto timestamp = boost::log::extract< boost::posix_time::ptime >("TimeStamp", rec))
{
std::tm ts = boost::posix_time::to_tm(*timestamp);
char buf[128];
if (std::strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S", &ts) > 0)
strm << "[" << buf << "]";
}
strm << "[" << rec[boost::log::trivial::severity] << "] ";
strm << rec[boost::log::expressions::smessage];
};