2015-06-20 50 views
4

我有一个将std :: ostream作为参数的进度条函数。为了便于描述,我在此简化了它。如何将ostream重定向到Boost日志库

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)))

+0

写一个整洁的小流缓冲(升压的Iostream Sink)并实现它来写入以提升日志。 (这可能已经由某人实施) – sehe

+0

我仍然在理解水槽的问题上挣扎。我设置了一个打印到控制台和多个文件的全局Boost记录器。是在这里,我需要钩这个streambuf?你能指点我一个教程还是一个例子?我一直无法找到一个实现我需要的例子。 –

+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); 
相关问题