Java 实现AOP方面时日志记录不起作用?
我正在尝试使用log4j配置的面向方面编程来实现日志记录。我的需求是独一无二的,所以我坚持使用相同的技术。在下面的代码中告诉我为什么日志记录不起作用,即使我可以看到System.out.println给出适当的结果 注意:log4j属性文件没有问题,如果单独调用,其工作正常Java 实现AOP方面时日志记录不起作用?,java,logging,log4j,spring-aop,Java,Logging,Log4j,Spring Aop,我正在尝试使用log4j配置的面向方面编程来实现日志记录。我的需求是独一无二的,所以我坚持使用相同的技术。在下面的代码中告诉我为什么日志记录不起作用,即使我可以看到System.out.println给出适当的结果 注意:log4j属性文件没有问题,如果单独调用,其工作正常 package com.test.media.core.logger; import org.apache.commons.logging.Log; import org.apache.commons.logging.Lo
package com.test.media.core.logger;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;
@Component
@Aspect
public class LoggingAspect {
//private final Log log = LogFactory.getLog(this.getClass());
private static final Log log = LogFactory.getLog(LoggingAspect.class);
@Before("execution(* com.test.media.core.*.*.*(..))")
public void logBefore(JoinPoint joinPoint) {
Log log = LogFactory.getLog(joinPoint.getClass());
System.out.println("logBefore is running " +joinPoint.getClass());
log.debug("medthod " + joinPoint.getSignature().getName()+"() is hijacked for execution");
log.debug("******");
}
@After("execution(* com.test.media.core.*.*.*(..))")
public void logAfter(JoinPoint joinPoint) {
log.debug("medthod " + joinPoint.getSignature().getName()+"() log After execution");
log.debug("******");
}
@AfterReturning(pointcut = "execution(* com.test.media.core.*.*.*(..))", returning = "result")
public void logAfterReturning(JoinPoint joinPoint, Object result) {
log.debug("medthod " + joinPoint.getSignature().getName()+"() log After Returning");
log.debug("Method returned value is : " + result);
log.debug("******");
}
@AfterThrowing(pointcut = "execution(* com.test.media.core.*.*.*(..))", throwing = "error")
public void logAfterThrowing(JoinPoint joinPoint, Throwable error) {
log.debug("medthod " + joinPoint.getSignature().getName()+"() is thowing some exception");
log.debug("Exception : " + error);
log.debug("******");
}
@Around("execution(* com.test.media.core.*.*.*(..))")
public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
Object retVal = joinPoint.proceed();
stopWatch.stop();
StringBuffer logMessage = new StringBuffer();
logMessage.append(joinPoint.getTarget().getClass().getName());
logMessage.append(".");
logMessage.append(joinPoint.getSignature().getName());
logMessage.append("(");
// append args
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
logMessage.append(args[i]).append(",");
}
if (args.length > 0) {
logMessage.deleteCharAt(logMessage.length() - 1);
}
logMessage.append(")");
logMessage.append(" execution time: ");
logMessage.append(stopWatch.getTotalTimeMillis());
logMessage.append(" ms");
log.debug(logMessage.toString());
return retVal;
}
}
谢谢你的建议。我得到了解决方案,基本上这不是一个java代码问题。由于垃圾pom条目,发生了此未知行为。工作pom条目如下所示:
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0</version>
</dependency>
您使用的是一个执行切入点,所以很有可能。getClass返回的类与您预期的不同,可能是aspect类,而不是“weaved”类。我会检查它是否具有您期望的值…尝试私有记录器log=LoggerFactory.getloggerloggingapect。class@Jango您可以在代码段中看到,我尝试了所有方法,但没有成功。@ORiLENTZ我尝试了joinPoint.getTarget.getClass.getName,但没有结果。。您尝试了哪些方法,哪些“不起作用”?你也可以添加测试类吗?
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.0</version>
</dependency>