使用slf4j进行日志记录时的spring aspectj切入点

我正在使用spring 3.0.6.我的应用程序有很多添加日志的地方(slf4j).假设我需要在每个严重错误上添加一些函数 – 我会更好地捕获每次调用错误级别的日志记录,并且可以在它之后执行工作 – 使用异常消息发送邮件到支持,或者像那样smth – 而不是手动添加代码应用程序中的所有位置.

我创建了以下课程:

@Aspect
public class LoggingWrapper {

    @Pointcut("execution (* org.slf4j.Logger.error(..))")
    public void logError() {
    }

    @AfterReturning("logError()")
    public void afterError() {
        //System.out.println("LOGERROR ASPECT AFTER");
        //send email...
    }
}

在春季配置:

<aop:aspectj-autoproxy />
<bean id="loggingWrapper" class="com.app.services.LoggingWrapper"/>

Aspect在我的课程中运作良好,但对于org.slf4j.Logger – 什么都没发生

最佳答案
@ crudo6,这对使用代理的Spring @AspectJ支持不起作用 – 原因是Spring处理@AspectJ注释的方式是创建代理,例如.如果您为@PointCut提供@Around建议(“执行(对于您的类)”),那么Spring将为Spring Context中的所有bean创建代理,其类型与切入点中的类匹配.

现在,由于slf4j类不是Spring上下文的一部分,因此不会为它们创建代理,并且您的方面将不会生效.

为了让它们工作,您可以尝试加载时间编织或编译时间编织并使用’@Pointcut(“call(* org.slf4j.Logger.error(…))”)’而不是执行,这样任何调用SLF4J可以被你的建议拦截. @Pointcut的执行需要编织slf4j库,这可能是不可能的.

转载注明原文:使用slf4j进行日志记录时的spring aspectj切入点 - 代码日志