2016-12-15 6 views
1

私は、ソースコードは、情報項目と進捗状況のプリントアウトが含まれているC++プロジェクトでGoogleのロガー(glog)を使用しています:Google Loggerとcoutの両方に送信するにはどうすればよいですか?

std::cout << some_useful_stuff << "\n"; 

そして、私はアイテムを情報ログに記録するGLOGを使用することができます。

LOG(INFO) << some_useful_stuff << "\n"; \\ gets echoed to stdout 

コードベース全体でstd::coutステートメントをすべて変更することはできません(私は第三者などのサブレポジトリをいくつか使用しており、は独自のロギングステートメントをに追加できません)、これによりif-elseコンストラクタ(これはとにかく醜いとにかく、ラップロジック内のすべての単一出力ステートメントをppingします)。

stdoutの出力をGLogに複製するにはどうすればよいですか?

std::cout << some_useful_stuff << "\n"; \\ message also goes to LOG(INFO) 

おそらく役に立ちます:これは実際には同時に発生する必要はありません。 {CONSOLE、LOGS、BOTH}のような選択肢があると便利ですが、{CONSOLE、LOGS}の間でもっと簡単な選択肢を置くことができます。

また、経験豊富なプログラマーですが、C++の初心者であれば、これはメガシンプルです。申し訳ありません - 事前に感謝!

+0

編集のおかげで@Borgleader ...その変更に打ち勝ちます) – thclark

+0

[boost: :iostreams :: tee_device](http://www.boost.org/doc/libs/1_60_0/libs/iostreams/doc/functions/tee.html)は、2つのストリームに同時に書き込むのに便利です。基本的に2つのストリームのラッパー。 – AndyG

答えて

0

glogについてはわかりませんが、通常はdup2システムコールを使用してファイルハンドラの出力を別のファイルハンドラにリダイレクトします。

あなたのケースでは、すべてのstd :: coutをglogだけで使用されるログファイルに書き込みます。

dup2(glog_file_handler、stdout);

これは、グログが書き込んでいるログファイルのファイルハンドルを取得する方法がある場合に有効です。詳細はhttp://man7.org/linux/man-pages/man2/dup.2.htmlを参照してください。

これが役に立ちます。

P.S.あなたのプログラムが複数のスレッド/プロセスを同じglogファイルに書き込んだり、glogが同期してログファイルに書き込んだ場合、これはうまくいきません

+0

ありがとう@A.N。 glogは非同期で書き込みます。私はGoogleのライブラリでファイルハンドラを見つけるのに苦労しています!私はさらに調査します。 – thclark

関連する問題