25

現在java.util.logging、Java プロジェクトの各メソッドのエントリ ポイントとエグジット ポイントをログに記録するために使用しています。これは、デバッグ時に非常に役立ちます。

各メソッドの先頭に次のコードがあり、最後に同様のコードがあります。

if (logger.isLoggable(Level.FINER)) {
    logger.entering(this.getClass().getName(), "methodName");
}

ここで、「methodName」はメソッドの名前です (ハードコーディングされています)。

したがって、このコードをすべてのメソッドに含めることなく、これを自動的に行う方法があるかどうか疑問に思っていました。

4

5 に答える 5

15

アスペクト指向プログラミングの使用をお勧めします。

たとえば、AspectJコンパイラ (Eclipse、Emacs などの IDE に統合可能) を使用すると、次のようなコードを作成できます。

aspect AspectExample {
    before() : execution(* Point.*(..))
    {
         logger.entering(thisJoinPointStaticPart.getSignature().getName(), thisJoinPointStaticPart.getSignature().getDeclaringType()   );

    }

    after() : execution(* Point.*(..))
    {
         logger.exiting(thisJoinPointStaticPart.getSignature().getName() , thisJoinPointStaticPart.getSignature().getDeclaringType()  );

    }
}

このアスペクトは、クラス「Point」のすべてのメソッドの実行前後にロギング コードを追加します。

于 2012-10-04T17:23:29.773 に答える
12

アスペクト指向プログラミングを検討する必要があります。検討すべきものとして、Spring AOPまたはAspectJをお勧めします。

また、 Spring AOPでロギングを開始するのに役立つ簡単なチュートリアルを次に示します。

于 2012-10-04T16:55:39.737 に答える
5

すでに提案されているように、jcabi-aspects の@Loggableアノテーションを使用して AOP を使用します(私は開発者です)。

@Loggable(Loggable.DEBUG)
public String load(URL url) {
  return url.openConnection().getContent();
}

ライブラリには、これらの注釈を理解し、SLF4J を介してメソッド呼び出し、それらの引数、および実行時間を自動的に記録する AOP アスペクトも含まれています。

また、詳細を説明するこのブログ投稿を確認してください: http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html

于 2013-02-03T08:08:01.713 に答える
2

slf4jを見てみましたか?メソッド名を自動収集できるLocationAwareLoggerを搭載。

于 2012-10-04T17:08:52.760 に答える
1

Aspect Oriented Programming、特に、around()定義で修飾したいメソッドの入り口と出口をログに記録するのに役立つジョインポイントを確認する必要があります。

于 2012-10-04T16:57:21.217 に答える