我有一个进度条函数,它将 std::ostream 作为参数。出于描述的目的,我在这里对其进行了简化。
void someprogressbar(std::ostream & stream)
{
stream << "Hello";
}
我无法修改此功能,因为它是第三方功能。我用 std::ostringstream myoss; someprogressbar(myoss)
调用这个函数或 someprogressbar(std::cout)
.该函数会在我的程序进行时实时打印一些信息。
如何将输出重定向到 Boost Log 库?我能做到BOOST_LOG_TRIVIAL(debug) << "Hello"
, 但做不到 someprogressbar(BOOST_LOG_TRIVIAL(debug)))
.
最佳答案
为了通过 ostream 将输出重定向到 Boost 记录器,我需要使用 Boost Iostreams 库创建一个接收器。感谢@sehe 的提示!
我在以下实现中使用 C++11:
#include <iosfwd>
#include <boost/iostreams/categories.hpp>
class Logger_Sink
{
public:
typedef char char_type;
typedef boost::iostreams::sink_tag category;
Logger_Sink() = default;
virtual
~Logger_Sink() = default;
virtual
std::streamsize
write(
char_type const * s,
std::streamsize n) = 0;
};
class cout_Sink: public Logger_Sink
{
public:
std::streamsize
write(
char_type const * s,
std::streamsize n)
{
BOOST_LOG_TRIVIAL(info) << std::string(s, n);
return n;
}
};
然后,我需要使用这个接收器来创建一个 ostream:
#include <iostream>
#include <boost/iostreams/stream.hpp>
namespace io = boost::iostreams;
io::stream_buffer<cout_Sink> cout_buf((cout_Sink()));
std::ostream mycout(&cout_buf);
关于c++ - 如何将 ostream 重定向到 Boost Log 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30958520/