如何将ostream重定向到Boost日志库

时间:2015-06-20 20:23:51

标签: c++ boost

我有一个进度条函数,它将std :: ostream作为参数。为了便于说明,我在这里进行了简化。

void someprogressbar(std::ostream & stream)
{
    stream << "Hello";
}

我无法修改此功能,因为它是第三方功能。我使用std::ostringstream myoss; someprogressbar(myoss)someprogressbar(std::cout)来调用此函数。该函数随着程序的进展实时打印一些信息。

如何将输出重定向到Boost日志库?我可以BOOST_LOG_TRIVIAL(debug) << "Hello",但不能someprogressbar(BOOST_LOG_TRIVIAL(debug)))

1 个答案:

答案 0 :(得分:3)

为了通过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);