2016-07-04 4 views
0

私はCaffeライブラリを使用して独自のC++分類プログラムを作成しています。 Caffeのモデル初期化ステップ中にすべてのログメッセージを非表示にしたい。 Disable glog's "LOG(INFO)" loggingによると自分のC++プログラムからのCaffeのロギングメッセージを削除

、 私は、コマンドラインから環境変数

GLOG_minloglevel = 2

を設定することでログのほとんどを無効にすることができます。

しかし、私が本当に望むのは、実行可能ファイル自体からすべてのログを削除して、GLOG_minloglevel値をリセットしてログを有効にすることができないようにすることです。

コンパイル時にglogのログメッセージを取り除く方法を見つけることができました(http://rpg.ifi.uzh.ch/docs/glog.html)。私のアプリケーションは、私はカフェのCMakeLists.txtに次のオプションadd_definitions(-DGOOGLE_STRIP_LOG=2)を追加することでカフェのライブラリを再構築するために必要な、C++ライブラリカフェ年代を使用しているので

> #define GOOGLE_STRIP_LOG 1 // this must go before the #include! 
> #include <glog/logging.h> 

: それは私がこのようなログを削除することができますと言います。 コンパイルは成功しましたが、新しいcaffeライブラリを使用してアプリケーションを実行すると、モデルの初期化中にセグメンテーション・フォルト・エラーが発生して停止します。 私はこのようにgdbを実行することによって、もう少し詳細なエラーメッセージを得ることができます:

プログラムは、信号SIGSEGV、セグメンテーションフォールトを受けました。 ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.S:153 153 ../sysdeps/x86_64/multiarch/memcpy-sse2-unaligned.Sに()__memcpy_sse2_unaligned:そのようなファイルまたはディレクトリ

CaffeのCMakeLists.txtにadd_definitions(-DGOOGLE_STRIP_LOG=2)を付けずに元のcaffeライブラリにロールバックすると、アプリケーションがうまく動作します。

誰でも私にこの問題を解決するヒントを教えてもらえますか?

ありがとうございます。

+1

なぜロギングを削除したいのかが気になる - ある時点では役に立たないだろうか? –

答えて

0

google :: LogToStderr()は次のように記述されていると考えてください。「すべてのログメッセージが標準エラーにしかならないようにする」 (glog/logging.hを参照)。

どのような処理を行っていても、ファイルへのログ記録を無効にする可能性があります。ファイルへのロギングを無効にするには、だから、

SetStderrLogging(0);   // thus everything is "also" logged to stderr 
for (int i = 0; i < NUM_SEVERITIES; ++i) { 
    SetLogDestination(i, "");  // "" turns off logging to a logfile 
} 

、あなたはすべての重大度のための()に「」のみSetLogDestinationを、必要があります。これは、その実装は単純であるが判明しました。

また、すべてのロギングをstderrに無効にすることもできます(デフォルトはGLOG_ERRORと思われる)。これは、追加で実現することができます。

google::SetStderrLogging(google::NUM_SEVERITIES); 

ところで、これを行うための私の根拠は、私はすでにアプリで使用されている別のロギングフレームワークにGLOGメッセージをリダイレクトしたいということです。私はさらに私は自分のシンクでgoogle :: AddLogSink()を呼び出すことによってこれを達成できることを発見しました。

関連する問題