ソースコードを変更できないプロジェクトの一部のパッケージに多くのクラスを記録する必要があります。したがって、パッケージ名を指定できるソリューションが必要です。springaopを使用すると、パッケージのクラスを変更せずにログを追加できますが、どうすればよいかわかりません。どうやってやるの?
1 に答える
Spring AOP では、これらのクラスが Spring Bean として使用されている場合にのみログに記録できます。さらに、パブリック メソッドの実行のみをログに記録できます。
これは、 Spring AOP と AspectJ バイト コード ウィービングの両方で使用できる@AspectJ 通知のアスペクトです (これは、「実際の AspectJ」と Spring AOP の両方と互換性のあるスタイルです。Springリファレンスの違いについて読んでください)。
@Aspect
public class LoggingAspect{
@Pointcut("execution(* com.mycompany.myproject.*.*(..))")
public void methodToLog(){
};
@Around("methodToLog()")
public Object logMethod(final ProceedingJoinPoint joinPoint) throws Throwable{
final StaticPart staticPart = joinPoint.getStaticPart();
final String sig =
"" + staticPart.getSignature() + " with args: "
+ Arrays.deepToString(joinPoint.getArgs());
System.out.println("Entering method " + sig);
final Object result = joinPoint.proceed();
System.out.println("Leaving method " + sig);
return result;
}
}
以下は、いくつかのメソッドを持つ愚かなクラスです。
package com.mycompany.myproject;
public class Dummy1{
public static void main(final String[] args){
final Dummy1 dummy = new Dummy1();
dummy.doSomeStuff();
dummy.doSomeStuffWithSomeArgs("Hello", 123);
}
private void doSomeStuff(){}
public void doSomeStuffWithSomeArgs(final String firstArg,
final int secondArg){}
}
このクラスを Eclipse / AJDT で Java/AspectJ アプリケーションとして開始すると、次の出力が得られます。
Entering method void com.mycompany.myproject.Dummy1.main(String[]) with args: [[]]
Entering method void com.mycompany.myproject.Dummy1.doSomeStuff() with args: []
Leaving method void com.mycompany.myproject.Dummy1.doSomeStuff() with args: []
Entering method void com.mycompany.myproject.Dummy1.doSomeStuffWithSomeArgs(String, int) with args: [Hello, 123]
Leaving method void com.mycompany.myproject.Dummy1.doSomeStuffWithSomeArgs(String, int) with args: [Hello, 123]
Leaving method void com.mycompany.myproject.Dummy1.main(String[]) with args: [[]]
Spring AOP でこれをテストするには、より多くの作業が必要になるため (メイン メソッドのアプローチは機能しません。ApplicationContext を作成し、メソッドを呼び出すタイプ Dummy1 の Bean を登録する必要があります)、そのままにしておきます。しかし、プライベート メソッドの呼び出しはログに記録されないことは確かです。
SpringSource Tool Suiteをダウンロードすると、アスペクトの視覚化とテストのための便利なツールが手に入ります。Spring AOP のみを使用したい場合でも、 AspectJ bookも読む必要があります。それは素晴らしい本です。
ところで: system.out ではなく、実際のロガーを使用したいことは明らかです。アスペクトごとに 1 つ定義するか、または (実際のアスペクトでのみ) ターゲット クラスに静的メンバーとして導入して、クラスごとのログを取得することができます。私の意見では、AspectJ のキラー機能です。