主な質問 - メソッドのパラメータがエラーになると、Spring AOPを使用してメソッドのパラメータを記録したいそのメソッドの実行時に例外が発生し、その例外が呼び出し側のメソッドにスローされます。Spring AOP @AfterThrowing - メソッドの詳細を呼び出すメソッドの呼び出し(メソッドを呼び出さない)
私は上記を行うことはできますか? @AfterThrowingのように、呼び出されたメソッドの詳細は記録されますが、呼び出されたメソッド(エラーが実際に発生した場所)は記録されません。
これは私が持っているものである -
テックスタック -
- 春ブーツ1.3.5
マイ@Aspectクラス -
@Aspect
@Component
public class LoggingAspect {
@AfterThrowing(pointcut = "execution(* com.spicedcider.service..*.*(..))", throwing = "e")
public void logExceptionContext(JoinPoint joinPoint, Throwable e) {
Object[] params = joinPoint.getArgs();
log.error("Exception while executing method below - ");
log.error("[" + joinPoint.getStaticPart().getSignature() + "]");
log.error("Exception message - " + e.getMessage());
log.error("Full stack trace logged further below");
log.error("Params for this method - ");
for (Object object : params) {
log.error(object == null ? "[is null]" : object.toString());
}
}
上記うまく動作します - フローが以下のようになると、
メイン呼び出し方法
public void executeBusinessLogic(String var1, String var2) {
/* some activities */
String myName = "Spiced Cider";
returnObject = anotherService.executeSubLogic(myName);
/* more activities based on returnObject */
}
支える今の方法
public Object executeSubLogic(String name) {
/* an exception occurs here and is thrown to executeBusinessLogic() */
}
は、AOPは、以下のようにこれを記録します。実際にエラーが発生した場所 - それは「と呼ばれる方法」対「呼び出し方法」と関連する項目をログに記録されて見ることができるように
[ERROR] [..LoggingAspect.logExceptionContext] - Exception while executing method below -
[ERROR] [..LoggingAspect.logExceptionContext] - [void executeBusinessLogic()]
[ERROR] [..LoggingAspect.logExceptionContext] - Exception message - <message>
[ERROR] [..LoggingAspect.logExceptionContext] - Full stack trace logged further below
[ERROR] [..LoggingAspect.logExceptionContext] - Params for this method -
[ERROR] [..LoggingAspect.logExceptionContext] - <var1 value>
[ERROR] [..LoggingAspect.logExceptionContext] - <var2 value>
。
私がこれを必要とする理由 - これはデバッグの観点からのものです。例外が発生すると、例外が発生したメソッドに渡されたパラメータを知る必要があります。
- 今、私はAOPを使用して、すべてのメソッドエントリとのparamsを記録することができます - - 私は、ログ/パフォーマンスを乱雑にしたくない - があった場合にのみ、のparamsを知ることが必要とされていると考え
のAlternates例外。
- 私はもちろんtry/catchブロックを使ってすべてのメソッドにこれを記録することができますが、それは定型コードをたくさん繰り返さなければならないということです。
私は、AOPを動作させる方法についての詳細があるが、上記の質問/議論を見つけることができなかった多くのフォーラムを検索した。これは私が見つけることができる他の唯一の投稿です - しかし、この質問に対する答えではありません - Spring AOP with groovy: get called method
私が探しているものができるかどうか私に教えてください/ ifこれは、これを行う正しい(または効率的な)方法でさえあります。ありがとうございました !
こんにちはkriegaex - 詳細をありがとうございます。私は上記のケース2です - executeSubLogic(...)を持つクラスは抽象基本クラスであり、インターフェイスを実装しません。私はそれを変えることができるかどうか確認するつもりです。 –