web-dev-qa-db-ja.com

Javaのメソッドの入り口/出口を自動的にログに記録する方法は?

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

各コードの冒頭にこのコードを配置し、最後に同様のコードを配置しています。

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

ここで、「methodName」はメソッドの名前です(ハードコード)。

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

22
Paul T.

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

たとえば、 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」クラスのすべてのメソッドの実行の前後にロギングコードを追加します。

13
Salles

アスペクト指向プログラミング を見てください。私は Spring AOP または AspectJ をあなたが見るべきものとして提案するでしょう。

また、これは Spring AOPでのロギング の使用を開始するのに役立つ簡単なチュートリアルです。

12
Sujay

すでに示唆したように、AOPは @Loggablejcabi-aspects からの注釈(私は開発者です):

@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

5
yegor256

slf4j を見てみましたか?メソッド名を自動的に収集できる LocationAwareLogger があります。

2
user1697575

アスペクト指向プログラミング 、特に定義で修飾したいメソッドの入り口と出口を記録するのに役立つaround()結合点を確認する必要があります。

1
Vikdor