4

設定ファイルとしてapachecommonnloggingとlog4j.xmlファイルを使用してロガーを実装しようとしています。

したがって、実際のJavaコードでは、ログを次のように書き込んでいます。

appacheの一般的なロギングを使用しています

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

そして私はのような情報を記録しています。クラスごとにログのインスタンスを作成しています

 private static Log    logger  = LogFactory.getLog( MyClass.class );
    private static final String      name   ="SAM";
    logger.info("name= "+name);
  1. だから今私の質問は、このようなロガーを実装するとパフォーマンスの問題が発生するのでしょうか?

  2. 次のようなログを確認する必要がありますか

    if ( log.isInfoEnabled( ) ) 
     {
      log.info( "Info message" );
      }
    

混乱は主に、Apacheの一般的なロギングでこれを行うと述べており、log4jでは不要であると述べているためです。

ファイルにログを書き込むたびに?

-サム

4

3 に答える 3

2

通常、ロギングの潜在的なパフォーマンス上の大きな問題は、文字列に変換するのに非常にコストがかかるものを log メソッドに渡した場合です。そのため、 のようなメソッドをisInfoEnabled()使用して、コードがパラメーターからメッセージ文字列を作成することを回避できます (そうしないと、info()メソッド内のチェックが遅すぎて、変換が既に行われています)。ログ メソッドに渡されたオブジェクトが文字列であるか、あまり関与していない場合、is*Enabled()メソッドはあまり役に立ちません。

SLF4J はチェックする価値があります。それはクラスローダのトリック (commons-logging が非難される理由の大部分) に依存せず、有効なチェックが内部で行われるように、メッセージ文字列が作成されるときに遅延するログ メッセージを作成する別の方法を持っています。ロギング方法。

于 2012-12-28T17:29:29.307 に答える
2
  1. はい、いいえ、ロギングは常にパフォーマンスを低下させますが、一部の関数は他の関数よりも高価です。たとえば、呼び出し元のクラス/メソッド名の取得はリフレクションを使用し、非常に遅いです。しかし、通常の logfuntion は、呼び出し元のロギング関数に高価なステートメントがない場合、それほど高価ではありません (これは、log-Level がチェックされる前に毎回評価されます。この場合、.isLevelEnabledcheck を使用して評価を防ぐことができます)。また、コンソールへのロギングは、ファイルへのロギングよりも出力に時間がかかります。これについての詳細は、グーグルやlog4jのFAQ/マニュアルで見つけることができます。

  2. ログを記録する前にログ レベルを確認する必要はありません。これは、ログ関数自体の中で行われます。したがって、すべてのレベルまたは一般的なログ メソッドのレベル引数に対して異なるメソッドがあります。

于 2012-12-28T17:12:58.233 に答える
1

これをすべて行うためのより良い方法があります。ifDebugEnabled、などのメソッドの混乱を追加することなく、本当に優れたパフォーマンスを得ることができます。Logback (または SLF4J)のようなものをチェックしてください。必要な API の種類に関する優れたドキュメントを次に示します。Log4J と Commons-Logging には、このような API がないことに注意してください。パラメータ化されたロギングを使用します。

于 2012-12-28T17:35:24.320 に答える