【发布时间】:2014-08-01 23:05:51
【问题描述】:
我需要帮助来初始化 boost 日志框架,以同时记录到命名日志文件和控制台 - (命名日志文件不需要定期轮换或许多 boost 教程中的任何花哨设置)。
日志文本应该同时发送到两个接收器,但是我需要稍微不同地格式化控制台输出(因为它将被用户查看。)我能够使用boost example code。对于我需要做的事情来说,它过于复杂,而且就访问适当的记录器而言,它确实令人困惑。我需要做的就是将带有时间戳的消息发送到日志文件,并在没有时间戳或换行符的情况下将相同的信息发送到控制台日志(仅像我通常使用<< std::endl 那样明确地放入新行)。我真的很想继续使用 boost 的日志框架,因为它提供了未来扩展的灵活性。
在示例中,我尝试了tail -f 日志文件 - 但是日志输出似乎不会在每个日志条目后自动刷新。虽然这对文件日志来说不是很重要,但这对于控制台输出流来说至关重要,因为它代表了用户将要监控的实时活动。
非常感谢任何帮助甚至更好的一些非常简单的示例代码,以使基础工作正常。
我设置日志记录的方式(根据上面的链接)如下所示,我想用控制台记录器替换这些已注册的接收器之一 - 但我不确定如何。我希望控制台记录器会自动刷新。
// Setup the common formatter for all sinks
logging::formatter fmt = expr::stream
<< std::setw(6) << std::setfill('0') << line_id << std::setfill(' ')
<< ": <" << severity << ">\t"
<< expr::if_(expr::has_attr(tag_attr))
[
expr::stream << "[" << tag_attr << "] "
]
<< expr::smessage;
// Initialize sinks
typedef sinks::synchronous_sink<sinks::text_ostream_backend> text_sink;
boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(boost::make_shared<std::ofstream>("full.log"));
sink->set_formatter(fmt);
// register the full log sink
logging::core::get()->add_sink(sink);
sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(boost::make_shared<std::ofstream>("important.log"));
// sink->set_formatter(fmt); (I removed this to not have any special formatting hopefully)
sink->set_filter(severity >= warning || (expr::has_attr(tag_attr) && tag_attr == "IMPORTANT_MESSAGE"));
// register the important log sink
logging::core::get()->add_sink(sink);
// Add attributes
logging::add_common_attributes();
【问题讨论】:
标签: c++ logging boost boost-log boost-logging