我正在尝试通过记录器调用来修改日志消息。由于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(“执行( org.slf4j.Logger.debug(..))”) - 捕获每个包下的所有调试调用
@Pointcut(“within()&amp;&amp; execution( org.slf4j.Logger.debug(..))”) - 捕获每个包下的所有调试调用
@Pointcut(“in(com .. )&amp;&amp; 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中尝试了多个组合,但似乎都没有。 感谢您的帮助
答案 0 :(得分:0)
我有类似的问题,我认为这可能适合你:
within (com.your.package) && call (* org.slf4j.Logger.debug(..))
可能需要一些稍微不同的调用参数语法。这似乎对我有用。我的具体案例是关于捕获Thread.sleep()的调用,但我只想从我的包中捕获调用,所以我使用了以下内容:
@Around("within (com.mycompany.mypackage) && call (void java.lang.Thread.sleep(long))")
我认为关键的区别在于“执行”正在捕捉到在被叫方发生方法调用的情况,但“呼叫”正在捕捉呼叫方的呼叫。因此,基本上,“执行”发生在“org.slf4j.Logger”包中,因此当您进一步过滤“并在我的包中”时,没有重叠。但是,“调用”发生在您的包(和其他包)中,因此与您的包交叉是有意义的。