web-dev-qa-db-ja.com

最も効率的なスレッドセーフC ++ロガーとは何ですか?

パフォーマンスが重要なマルチスレッドアプリケーションに取り組んでいます。 rlog、Ace、Boostのログを確認しました。 rlogを選んだのは、それが最も高速だったためです(ロギングが無効になっている場合、オーバーヘッドが最小です)。

私が持っている問題は、リリースモードでもファイル名、行番号などを表示することです。その情報を遮断する方法を教えていただければ、私の問題は解決するかもしれません。いずれにしても、私の状況で最も効率的なC++のロガーは何ですか?

85
cppalphadev

残念ながら、現時点では賛成票を投じることはできません。私の知る限り、Apache log4cxxのようながらくたを使ったことはありません。重大なバグが含まれています。

  1. 0.9ブランチの最後のリリースは0.9.7であり、仮想メンバーを持つすべてのクラスには仮想dtorがないため、メモリリークが含まれています。
  2. 最新のリリース0.10.xは0.9.xから多くの機能を失い、後方互換性はありません。独自のコードの多くを書き直す必要があります。
  3. プロジェクト全体はメンテナンスされていないようです。 0.11.xxのリリースは2年間発表されています。

私の意見では、ブーストで行く必要があります。

33
kirsche40

Pantheios が最良と考えられます C++ロギングライブラリを実行する であり、100%タイプセーフな唯一のものであると主張します( この記事を参照 printf()/ iostreamベースのライブラリがタイプセーフでない理由を説明する関連ライブラリについて)

19
dcw

http://logging.Apache.org/log4cxx/index.html でlog4cxxで成功しました。人気のあるLog4jロガーのC++バージョンであり、confファイルまたはコードで簡単に設定できます。無効になっているときのオーバーヘッドは最小限です(メソッド呼び出しと整数比較)。

ログへの出力のパターンは、日付/時刻とメッセージのような単純な変換パターンによって定義されます。また、ファイルサイズの制限、ロールオーバーなども処理します。また、さまざまなエラーやソースに対して異なるパターンを構成することもできます。

10
user54700

Rlogが提供する追加情報(ファイル名、行番号など)をシャットオフする方法は次のとおりです。 main()関数(またはどこでも)でrlogを初期化すると、次のようになります。

rlog::RLogInit(argc, argv);
rlog::StdioNode slog (2, rlog::StdioNode::OutputColor);
slog.subscribeTo( RLOG_CHANNEL("error") );

StdioNodeの2番目の引数は、出力を制御するフラグ用です。可能なフラグの全リストについては、rlogのドキュメント(Doxygenで生成可能)を確認してください。この例の1つでは、rlogに重大度に応じて出力のみを色付けし、他の情報を追加しません。

9
cassava

ロゴシステムを検討することをお勧めします。 logogはまさにこの種の機能を提供しますが、Pantheosが持つ暗黙的なコード依存性はありません。 logogはスレッドセーフであり、任意の時点で記録されるメッセージの種類を高度に制御できます。

私はlogogの著者であり、メンテナーなので、私の意見は少し偏っています。しかし、これを実装する前に、rlog、Pantheos、およびその他のロギングシステムを確認しました。

https://github.com/johnwbyrd/logog .

9
johnwbyrd

オーバーヘッドの一部は、マクロ/ストリームで発生する場合があります。ロギングが無効になっている場合、ロギングされる文字列を作成しないように非常に注意する必要があります。

ストリームと?:演算子を巧妙に使用すると、マクロと同様にそれを行うことができます。

4
Arkadiy

c-logライブラリ、 https://github.com/0xmalloc/c-log 、C/C++言語用の高速で安定したスレッドセーフなログライブラリを試してください。

2
user2538508

PocoにはNice loggingサポートがあります...

http://pocoproject.org/slides/110-Logging.pdf

2
Bhai

多分 pantheios
スレッドセーフかどうかはわかりませんが...

2
mhd