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

时间:2012-03-20 08:59:45

标签: spring aop 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...
    }
}

在spring config中:

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

Aspect适用于我的课程,但对于 org.slf4j.Logger - 没有任何反应

2 个答案:

答案 0 :(得分: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库,这可能是不可能的。

答案 1 :(得分:0)

在错误情况下同步发送邮件是一种不好的做法。您最终可能会发送过多的电子邮件,这些电子邮件可能会占用较长时间的线程并影响应用程序性能。可扩展性。最好的方法是使用日志监控工具,如Splunk。