gpt4 book ai didi

c++ - 使用 Boost 同时记录到控制台和文件

转载 作者:搜寻专家 更新时间:2023-10-31 01:04:19 25 4
gpt4 key购买 nike

我需要帮助来初始化 boost 日志记录框架以同时记录到命名日志文件和控制台 -(命名日志文件不需要定期轮换或许多 boost 教程中的任何花哨设置)。

记录文本应该同时发送到两个接收器,但是我需要稍微不同地格式化控制台输出(因为它会被用户查看)。我能够使用<强> boost example code 。对于我需要做的事情来说,它过于复杂,而且就访问适当的记录器而言,它确实令人困惑。我需要做的就是将带时间戳的消息发送到日志文件,并将没有时间戳或换行符的相同信息发送到控制台日志(仅像我通常使用 << std::endl 那样显式地放入新行)。我真的很想坚持使用 boost 的日志记录框架,因为它提供了 future 扩展的灵 active 。

举个例子,我试过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();

最佳答案

这里是一些使用 Boost-Log 的全局记录器的示例代码。我调用 init_term()初始化我的终端记录器和 init_logfile() 来初始化我的日志文件。

注意 auto_flush(true) 调用

// Logging macro
#define LOG(level) BOOST_LOG_SEV(global_logger::get(), level)
// Initializing global boost::log logger
typedef boost::log::sources::severity_channel_logger_mt<
severity_level, std::string> global_logger_type;

BOOST_LOG_INLINE_GLOBAL_LOGGER_INIT(global_logger, global_logger_type)
{
return global_logger_type(boost::log::keywords::channel = "global_logger");
}

// Initialize terminal logger
void init_term()
{
// create sink to stdout
boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(
boost::shared_ptr<std::ostream>(&out, boost::empty_deleter()));

// flush
sink->locked_backend()->auto_flush(true);

// format sink
sink->set_formatter
(
/// TODO add your desired formatting
);

// filter
// TODO add any filters

// register sink
bl::core::get()->add_sink(sink);
}

// Initialize logfile
void init_logfile(const std::string& logfilename)
{
// create sink to logfile
boost::shared_ptr<text_sink> sink = boost::make_shared<text_sink>();
sink->locked_backend()->add_stream(
boost::make_shared<std::ofstream>(logfilename.c_str()));

// flush
sink->locked_backend()->auto_flush(true);

// format sink
sink->set_formatter
(
/// TODO add your desired formatting
);

// filter
// TODO add any filters

// register sink
bl::core::get()->add_sink(sink);
}

关于c++ - 使用 Boost 同时记录到控制台和文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24170577/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com