log4netロギングメソッド(デバッグ、情報など)はどれくらい高速ですか?

StackOverflow https://stackoverflow.com/questions/178973

  •  05-07-2019
  •  | 
  •  

質問

私は log4net の大ファンですが、最近(一部の部署では)各ロギング方法が一見重いため、プロジェクトに含まれています。私は他の技術よりも優れた技術があると主張しますが、それは別の質問です。

知りたいのですが、log4net DebugFormatタイプの呼び出しがアプリケーションに与える典型的な影響は何ですか。コードの行ごとのログステートメントの数などの変数は省略します。実際の世界で見たものを探しているからです。

そして、次のような長い評価ステートメントにガード句を追加する簡単なテクニックを知っています。

if (log.IsDebug)
{
  log.DebugFormat(...);
}

だから、今のところ考慮からそれを除外しましょう。

役に立ちましたか?

解決

log4netまたはlog.DebugFormat(...)に慣れていません。

しかし、ロギングのコストは実際には2つの領域にあります。

1つ目はロギング呼び出し、2つ目はログ情報の実際の永続化です。

ガードは、ロギングが実際に必要でない場合に、ロギング呼び出しを最小限に抑えるのに役立ちます。メソッド呼び出しと2つのスカラーの比較にすぎないため、非常に高速になる傾向があります。

ただし、ガードを使用しない場合、実際のログ引数を作成するコストがコストになる可能性があります。

たとえば、log4jでは、これは一般的なイディオムでした:

log.debug("Runtime error. Order #" + order.getOrderNo() + " is not posted.");

ここで、コストはメッセージを作成する文字列式の実際の評価です。これは、ロギングレベルに関係なく、その式と結果の文字列が作成されるためです。代わりに次のようなものがあると想像してください:

log.debug("Something wrong with this list: " + longListOfData);

これにより、ログレベルがDEBUGに設定されていなかった場合に単純に無駄になる、大きくて高価な文字列変数が作成される可能性があります。

警備員:

if (log.isDebug()) {
    log.debug(...);
}

isDebug呼び出しは、特に実際の引数の作成と比較して安価であるため、この問題を解消します。

私のコードでは、ロギング用のラッパーを作成しました。次のようなログを作成できます。

log.debug("Runtime error. Order # {0} is not posted.", order.getOrderNo());

これは妥協案です。これはJavaの可変引数に依存しており、私のコードはログレベルをチェックしてから、メッセージを適切にフォーマットします。これはガードとほぼ同じ速度ですが、書く方がずっときれいです。

今、log.DebugFormatはよく似たようなことをするかもしれませんが、私は知りません。

これに加えて、当然ながら、ロギングの実際のコスト(画面、ファイル、ソケットなど)があります。しかし、それはあなたが受け入れる必要があるだけの費用です。そのための私のベストプラクティスは、実際的な場合、実際のログメッセージをキューにルーティングし、それを別のスレッドを使用して適切なチャネルに取得して出力することです。これは、少なくとも、メインコンピューティングとの連携を維持するのに役立ちますが、独自の費用と複雑さがあります。

他のヒント

これが古いスレッドであることは知っていますが、次のようにログレベルに基づいたifステートメントでコードを埋めるのを回避するアプローチを使用してはどうでしょうか。 http://www.beefycode.com/post/Extension- Methods-for-Deferred-Message-Formatting-in-Log4Net.aspx

ラムダ式を使用してメッセージを作成すると、メッセージ全体を評価することさえ避けられます。

log4net FAQにはこれに対する回答があります、あなたが探している詳細レベルではありませんが。

要約:これらのガード句を使用します。

Will Hartungの答えを.NETの観点から与えてください:)

DebugFormatコードは次のとおりです。

if (IsDebugEnabled)
{
    Logger.Log(ThisDeclaringType, m_levelDebug, new SystemStringFormat(CultureInfo.InvariantCulture, format, args), null);
}

基本的には同じであるため、DebugFormatを使用する場合、guard句を使用する必要はないと思います(まだ小さなオーバーヘッドがありますが、無視できるほど小さいと思います)

コメントを残していましたが、評判が十分ではありません:/

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top