メソッドエントリ (パラメーター値を含む) をログに記録し、Spring AOP と log4j をトレースレベルで終了する方法については、誰でも知っています。複数のパッケージからクラスをログに記録できる必要があります。
11318 次
2 に答える
6
このような目的で@Around(..)アスペクトを使用できます。
@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;
}
}
この例では、アスペクトはcom.blablabla.serverパッケージの下のすべてのサブパッケージのすべてのメソッド呼び出しをログに記録します。また、すべてのメソッド入力パラメーターをログに記録します。
于 2012-08-09T10:56:49.917 に答える
1
Spring フレームワークの PerformanceMonitorInterceptor を使用して、メソッド エントリをログに記録できます。DZoneの使用例を次に示します。
于 2012-08-09T10:26:01.270 に答える