2015-06-20 4 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

написать аккуратную streambuf (бустерного Iostream Sink) и реализовать его для записи в буфере. (Это, вероятно, уже будет реализовано кем-то) – sehe

+0

Я все еще борюсь с пониманием раковины. Я настраиваю глобальный логгер Boost, который печатает на консоль и несколько файлов. Является ли здесь, что мне нужно подключить этот streambuf? Не могли бы вы указать мне учебник или пример? Я не смог найти пример, который реализует то, что мне нужно. –

+0

Хорошо, я понял, как это решить. Я отправлю ответ позже. –

ответ

3

Чтобы перенаправить вывод на логгер Boost через ostream, мне нужно было создать раковину, используя библиотеку 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); 
Смежные вопросы