使用Spring AOP清理记录器

时间:2019-07-15 12:16:49

标签: java spring logging aop spring-aop

我们正在尝试使用Spring AOP在catch块下的日志语句中在我们的应用程序中引入通用记录器。

在AOP之前

try
{
\\Business Logic 
}
catch(Exception e){
\\some recovery mechanism that won't be generic across different layers
log.error();//These statements needs to be moved to generic logger
}

在阅读了Spring Docs之后,我发现可以使用AfterThrowing建议来完成。 抛出建议后,如果方法因抛出异常而退出,则将执行建议。

为此,我们将通过在Exception内重新抛出catch块来更改现有的异常处理代码,以使AfterThrowing的建议起作用。

AOP之后:

try
{
\\Business Logic
}
catch(Exception e){
 \\some recovery mechanism that won't be generic across different layers
throw e;
}

AOP代码:

@Aspect
@Sl4j
@Component
public class LoggingAdvice {
    @AfterThrowing(pointcut = "execution (* * com..*(..)", throwing = "e")
    public void myAfterThrowing(JoinPoint joinPoint, Exception e) {    
    log.error("Exception occured",e);
    }
}

您是否认为有比此方法更好的解决方案,而不是在catch块中重新抛出Exception并按照调用层次结构向上传播它?

请注意,任何引发或未经检查的异常都会被AfterThrowing Advice捕获。我要做的就是通过删除catch块内的log.error来执行记录器清理,并使用AOP将其通用。

2 个答案:

答案 0 :(得分:0)

更好的方法是删除catch块,因为您仍然要使用@AfterThrowing。并在该方面的执行之上实现您想要实现的一切。

答案 1 :(得分:0)

正如此处所讨论的,@AfterThrowing非常适合记录实际上 被抛出的异常。

您的案例非常特殊,因为您要记录被 捕获/处理 的异常。如果在此用例中使用use full AspectJ而不是Spring AOP,则可以使用this answer中的示例代码所述的handler(*)切入点。这将使您能够从catch块中剔除日志语句,而无需升级(重新抛出)已经正确处理的异常,从而更改了逻辑并有必要在以后将其捕获到其他地方