【发布时间】:2015-04-19 15:04:27
【问题描述】:
我正在尝试应用有关记录器调用的建议来修改日志消息。由于大多数库中都使用了 Logger 框架,我想只捕获来自特定包的记录器调用。
@Aspect
public class LogAspect {
@Pointcut("within(com.testing.servlet..*) && execution(* org.slf4j.Logger.debug(..))")
public void logging() {
}
@Around("com.testing.aspect.LogAspect.logging()")
public void around(ProceedingJoinPoint jp) {
Object[] args = jp.getArgs();
String modifiedLogMessage = "Appended Log - ";
for (int i = 0; i < args.length; i++) {
if (args[i] instanceof String) {
modifiedLogMessage += (String) args[i];
args[i] = modifiedLogMessage;
}
}
try {
jp.proceed(args);
} catch (Throwable e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我尝试了不同的可能性,但它不起作用,
@Pointcut("within(com.testing.logging.)) - 捕获特定包下的所有调试调用
@Pointcut("execution( org.slf4j.Logger.debug(..))") - 捕获每个包下的所有调试调用
@Pointcut("within() && execution( org.slf4j.Logger.debug(..))") - 捕获每个包下的所有调试调用
@Pointcut("within(com..) && execution( org.slf4j.Logger.debug(..))") - 不捕获任何东西
我基本上遗漏了一些东西,并且对如何正确应用切入点感到困惑
aop.xml
<!DOCTYPE aspectj PUBLIC
"-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver options="-verbose -showWeaveInfo">
<!-- <include within="com.testing.*" />
<include within="org.slf4j.*"/> -->
</weaver>
<aspects>
<aspect name="com.testing.aspect.LogAspect" />
<!-- <concrete-aspect name="com.testing.aspect._My_AbstractAspect"
extends="com.testing.aspect.AbstractLogAspect">
<pointcut name="scope" expression="execution(* org.slf4j.Logger.debug(..))" />
</concrete-aspect> -->
<!-- <include within="com.testing.*" /> -->
</aspects>
</aspectj>
我也在 aop.xml 中尝试了多种组合,但似乎没有一个有效。 提前感谢您的帮助
【问题讨论】:
-
您是否尝试过在切入点中使用“调用”而不是“执行”?不能告诉你确切的原因,但它对我有用......