最も効率的なスレッドセーフなC ++ロガーは何ですか?[閉まっている]


85

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

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


23
私は、ブーストにはすべてがあるという結論に急速に近づいています。そうでない場合でも、もう一度見ると表示されます!
マーティンベケット

20
なぜこれが閉じられているのかわかりません。彼は具体的で測定可能な質問をしました。使用されているコンパイラを無視すると、「最も効率的なスレッドセーフなC ++ロガー」は1つだけになります。最近のStackoverflow ....
JohnJohn 2015


回答:


35

残念ながら、現時点では反対票を投じることはできません。私が言うことができる限り、Apachelog4cxxのようながらくたを決して使用しないでください。深刻なバグが含まれています。

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

私の意見では、あなたは後押しで行くべきです。


10
「仮想メンバーを持つすべてのクラスには仮想dtorがありません」はそれを信じず、チェックする必要がありました。かなり不満なApache。
ManuelSchneid3r 2015年

6
今すぐ反対票を投じることができます:)
モニカの訴訟に資金を

5
>>「仮想メンバーを持つすべてのクラスには仮想dtorがありません」これは素晴らしいことではありませんが、問題が発生するという意味ではありません。クラスが静的タイプではなく動的タイプによって削除された場合にのみ問題になります。これだけでは問題ではなく、メモリがリークしているわけではありません。
evilrix 2017年

1
@evilrixクラスに仮想メンバーがありますが仮想dtorはありません。クラスには、保護された/プライベートな新しいオペレーターがいません。実際、これは非常に貧弱で悪いコードであり、リリースされるべきではありませんでした。それで、あなたのポイントは何ですか?
kirsche40 2017年

@ kirsche40私の主張はかなり明確だと思いました。規格の言い回しについての私の説明のどの部分が理解できませんでしたか?言い換えると、基本クラスのポインタを介して削除しようとすると問題になります。その場合、デストラクタが仮想でない場合、動作は定義されていません。この点で、基準は非常に明確です。私が言ったことのどれも、OPがこれを実装として使用することを主張していることを意味するものではないと確信しています。
evilrix

19

Pantheiosは、最高のパフォーマンスを発揮するC ++ロギングライブラリであると考えられており、100%タイプセーフな唯一のライブラリであると主張しています(printf()/ iostreamベースのライブラリがタイプセーフでない理由を説明する関連ライブラリに関するこの記事を参照してください-安全)


4
また、Pantheiosが気に入らなくても、リンクしたページの「競合他社」のリストは参考になります。
jwd 2011年

10

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

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


9

rlogが提供する追加情報(ファイル名、行番号など)を遮断する方法は次のとおりです。main()関数(または任意の場所)でrlogを初期化するときは、次のようにします。

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

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


9

あなたはlogogシステムを検討したいかもしれません。Logogはまさにこの種の機能を提供しますが、Pantheiosが持っている暗黙のコード依存関係はありません。Logogはスレッドセーフであり、どのタイプのメッセージをいつでもログに記録するかを高度に制御できます。

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

https://github.com/johnwbyrd/logog


リンクを更新しました、メモありがとうございます。
johnwbyrd 2017

4

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

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




2

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


8
残念ながら、c-logはGPLの下にあります。つまり、GPLと互換性のない(プロプライエタリな商用)ソフトウェアでは使用できません。これにより、多くのユーザーが使用できなくなります。
クリス2014

現在、github.com / 0xmalloc / c-log にはライセンスがありません。商用および個人使用は無料です。
user2538508 2014

2
あなたはc-logの作者ですか?その場合は、ソフトウェアがどのライセンスでリリースされているかを明示的に(Githubページのreadmeファイルとソースコードのコメントに)記載することを強くお勧めします。それがパブリックドメインであることを意図しているとしても(私はお勧めしません!)、それを明示的に述べる必要があります。そうは言っても、選択できる「商業に適した」(つまり、寛容な)オープンソースライセンスはたくさんあります。最も人気のあるものは、Apache、BSD、またはMITです。
クリス2014

Linuxのみ?(#include <pthread.h>...)
rustyx 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.