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

标签 spring aop aspectj slf4j

我正在使用 spring 3.0.6。我的应用程序有很多地方添加了日志记录(slf4j)。假设我需要为每个严重错误添加一些函数 - 对我来说最好能捕捉到对 的每次调用。错误级别日志记录 并在它之后做可能的工作 - 发送邮件以支持异常消息,或类似的东西 - 而不是手动将代码添加到应用程序中的所有位置。

我创建了以下类(class):

@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 配置中:
<aop:aspectj-autoproxy />
<bean id="loggingWrapper" class="com.app.services.LoggingWrapper"/>

Aspect 在我的类(class)中运行良好,但对于 org.slf4j.Logger - 什么都没有发生

最佳答案

@crudo6,这不适用于使用代理的 Spring @AspectJ 支持 - 原因是 Spring 处理 @AspectJ 注释的方式是创建代理,例如。如果您 @Around给您的建议 @PointCut("execution (for your class)") ,那么 Spring 将为 中的所有 bean 创建代理。 Spring 上下文 具有与切入点中的类匹配的类型。

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

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

关于使用 slf4j 进行日志记录的 spring aspectj 切入点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9783828/

相关文章:

java - get 无法访问 EntityBean 错误,其中删除 javaEbean 依赖项

java - 如何防止 Validator 以不相关的 ModelAttribute 为目标?

.net - .NET仍在积极开发哪些面向方面的编程(AOP)库?

spring-boot - 从方法调用时@Retryable 不起作用

java - AspectJ Weaver & java 模块系统(spring + gradle),编译问题

java - Spring Autowiring map 行为

java - Spring注入(inject)Bean引用打印内存地址而不是值

java - Spring AOP 和注释在方法执行之前检查参数

java - 具有 super 方法调用的继承方法的切入点

java - 带有方面参数的注释