そこで、Boost.IOstreamsを調べました。これが、私が思いついたものです。
class TestSink : public boost::iostreams::sink {
public:
std::streamsize write( const char * s, std::streamsize n ) {
std::string message( s, n );
/* This would add a message to the log instead of cout.
The log implementation is threadsafe. */
std::cout << message << std::endl;
return n;
}
};
TestSink
ストリームバッファを作成するために使用できます(stream_buffer-templateを参照)。すべてのスレッドは独自ののインスタンスを受け取りますがTestSink
、すべてTestSinks
が同じログに書き込みます。TestSink
次のように使用されます。
TestSink sink;
boost::iostreams::stream_buffer< TestSink > testbuf( sink, 50000 );
std::ostream out( &testbuf );
for ( int i = 0; i < 10000; i++ )
out << "test" << i;
out << std::endl;
ここで重要なのは、ストリームがフラッシュされたとき(または)、またはインスタンスの内部バッファーがいっぱいにTestSink.write
なったときにのみ呼び出されることです(デフォルトのバッファーサイズは40000文字を保持できないため、50000に初期化します)。このプログラムでは、が1回だけ呼び出されます(出力が長すぎてここに投稿できません)。このようにして、一時変数なしで通常の形式のstream-IOを使用してログメッセージを書き込むことができ、ストリームをフラッシュするときにメッセージがログに1つにまとめて投稿されるようにします。std::endl
std::flush
stream_buffer
TestSink.write
私が考慮していない別の提案/問題がある場合に備えて、私は別の日に質問を開いたままにしておきます。