6

私はlog4netの大ファンですが、最近、(私の部署の) 何人かは、各ロギング方法が一見重いため、私たちのプロジェクトに log4net を含めることに疑問を呈しています。他よりも優れたテクニックがあると私は主張しますが、それは別の問題です.

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

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

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

というわけで、今のところは考慮から外しましょう。

4

4 に答える 4

11

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());

これは良い妥協案です。これはJavavarargsに依存しており、私のコードはロギングレベルをチェックしてから、メッセージを適切にフォーマットします。これは警備員とほぼ同じくらい速いですが、書くのはずっときれいです。

さて、log.DebugFormatも同様のことをするかもしれませんが、私にはわかりません。

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

于 2008-10-07T15:44:24.580 に答える
6

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

ラムダ式を使用してメッセージを作成すると、メッセージを完全に評価することさえ回避できます。

于 2012-12-08T19:23:53.710 に答える
4

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

要約すると、これらのガード句を使用してください。

于 2008-10-07T15:37:57.013 に答える
3

Will Hartungの答えに.NETの視点を与えるだけです:)

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

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

基本的には同じなので、DebugFormat を使用する場合はガード句を使用する必要はないと考えています (まだ小さなオーバーヘッドがあるかもしれませんが、無視できるほど小さいと思います)。

コメントを残したでしょうが、私には十分な評判がありません:/

于 2012-05-15T18:46:21.023 に答える