Java 使用Spring AOP记录方法项
任何人都知道如何记录方法条目(包括参数值)并在跟踪级别使用SpringAOP和log4j退出。它应该能够记录来自多个包的类。您可以使用Spring framework的PerformanceMonitorInterceptor来记录方法条目。是DZone的示例用法 您可以使用@Around(..)aspect来实现以下目的:Java 使用Spring AOP记录方法项,java,spring,logging,Java,Spring,Logging,任何人都知道如何记录方法条目(包括参数值)并在跟踪级别使用SpringAOP和log4j退出。它应该能够记录来自多个包的类。您可以使用Spring framework的PerformanceMonitorInterceptor来记录方法条目。是DZone的示例用法 您可以使用@Around(..)aspect来实现以下目的: @Component @Aspect @Order(value=2) public class LoggingAspect { @Around("exe
@Component
@Aspect
@Order(value=2)
public class LoggingAspect {
@Around("execution(* com.blablabla.server..*.*(..))")
public Object logMethod(ProceedingJoinPoint joinPoint) throws Throwable{
final Logger logger = LoggerFactory.getLogger(joinPoint.getTarget().getClass().getName());
Object retVal = null;
try {
StringBuffer startMessageStringBuffer = new StringBuffer();
startMessageStringBuffer.append("Start method ");
startMessageStringBuffer.append(joinPoint.getSignature().getName());
startMessageStringBuffer.append("(");
Object[] args = joinPoint.getArgs();
for (int i = 0; i < args.length; i++) {
startMessageStringBuffer.append(args[i]).append(",");
}
if (args.length > 0) {
startMessageStringBuffer.deleteCharAt(startMessageStringBuffer.length() - 1);
}
startMessageStringBuffer.append(")");
logger.trace(startMessageStringBuffer.toString());
StopWatch stopWatch = new StopWatch();
stopWatch.start();
retVal = joinPoint.proceed();
stopWatch.stop();
StringBuffer endMessageStringBuffer = new StringBuffer();
endMessageStringBuffer.append("Finish method ");
endMessageStringBuffer.append(joinPoint.getSignature().getName());
endMessageStringBuffer.append("(..); execution time: ");
endMessageStringBuffer.append(stopWatch.getTotalTimeMillis());
endMessageStringBuffer.append(" ms;");
logger.trace(endMessageStringBuffer.toString());
} catch (Throwable ex) {
StringBuffer errorMessageStringBuffer = new StringBuffer();
// Create error message with exception
logger.error(errorMessageStringBuffer.toString(), ex);
throw ex;
}
return retVal;
}
}
@组件
@面貌
@顺序(值=2)
公共类日志方面{
@大约(“执行(*com.blabla.server..**(..)”)
公共对象日志方法(ProceedingJoinPoint joinPoint)抛出可丢弃的{
final Logger Logger=LoggerFactory.getLogger(joinPoint.getTarget().getClass().getName());
Object retVal=null;
试一试{
StringBuffer startMessageStringBuffer=新StringBuffer();
附加(“开始方法”);
startMessageStringBuffer.append(joinPoint.getSignature().getName());
startMessageStringBuffer.append(“”);
对象[]args=joinPoint.getArgs();
对于(int i=0;i0){
startMessageStringBuffer.deleteCharAt(startMessageStringBuffer.length()-1);
}
startMessageStringBuffer.append(“)”;
trace(startMessageStringBuffer.toString());
秒表秒表=新秒表();
秒表。开始();
retVal=joinPoint.procedure();
秒表;
StringBuffer endMessageStringBuffer=新的StringBuffer();
endMessageStringBuffer.append(“Finish方法”);
endMessageStringBuffer.append(joinPoint.getSignature().getName());
endMessageStringBuffer.append((..);执行时间:);
endMessageStringBuffer.append(stopWatch.getTotalItemillis());
endMessageStringBuffer.append(“ms;”);
trace(endMessageStringBuffer.toString());
}捕获(可丢弃的ex){
StringBuffer errorMessageStringBuffer=新建StringBuffer();
//创建带有异常的错误消息
logger.error(errorMessageStringBuffer.toString(),ex);
掷骰子;
}
返回返回;
}
}
在本例中,aspect记录com.bla.server包下所有子包的所有方法调用。它还记录所有方法输入参数