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

cru*_*do6 4 aop spring aspectj slf4j

我正在使用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...
    }
}
Run Code Online (Sandbox Code Playgroud)

在春季配置:

<aop:aspectj-autoproxy />
<bean id="loggingWrapper" class="com.app.services.LoggingWrapper"/>
Run Code Online (Sandbox Code Playgroud)

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

Bij*_*men 8

@ crudo6,这对使用代理的Spring @AspectJ支持不起作用 - 原因是Spring处理@AspectJ注释的方式是创建代理,例如.如果您@Around为自己提供建议@PointCut("execution (for your class)"),那么Spring将为Spring Context中的所有bean创建代理,其类型与切入点中的类相匹配.

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

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