2015-06-20 48 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); 
相關問題