2012-10-04 11 views
13

今私はjava.util.loggingを使用して、Javaプロジェクトの各メソッドの入口点と出口点を記録しています。これはデバッグ時に私にとって非常に便利です。Javaのメソッドの入力/終了を自動的に記録する方法は?

Iは、各メソッドの開始と終了時に同様のもので、コードのこの部分を持っている:

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

場合「methodNameのは、」方法(ハード)の名前です。

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

答えて

10

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

例えば、(Eclipseに統合することができ、Emacsと他のIDEの)AspectJコンパイラを使用して、あなたはこのようなコードの一部を作成することができますが:

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"内のすべてのメソッドの実行前に実行されます。すでに提案さ

+0

オフラインアプリケーションでも動作しますか?どちらがサーバー上で実行されていませんか? –

+0

@ArturasMはい、AspectJのバイトコードはターゲットクラスに組み込まれているので、これはJVMで直接実行されます。したがって、Java仕様に準拠するJVMであれば、それを実行できます。 – Keith

12

Aspect oriented programmingをご覧ください。私はSpring AOPまたはAspectJをあなたが見るべきものとして示唆しています。

また、ここではあなたが資格たいメソッドの入り口と出口を記録することは有用であろう、特にaround()ジョインポイント、あなたがAspect Oriented Programmingをご覧くださいLogging with Spring AOP

+0

しかし、私は春には、サーバー上で実行されていないオフラインアプリケーションで動作するとは思わないが、彼らの操作を行います。

また、詳細を説明し、このブログの記事をチェック! AspectJはどうですか? –

1

を始めるのに役立つ簡単なチュートリアルです定義。

4

jcabi-aspectsから@LoggableアノテーションでAOPを使用する(私は開発者だ):

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

ライブラリはまた、これらの注釈を理解し、自動的にメソッドの呼び出し、その引数を記録しますAOPアスペクトを含んでいます、 SLF4Jを使用して実行時間を調整します。 http://www.yegor256.com/2014/06/01/aop-aspectj-java-method-logging.html

関連する問題