mardi 12 mai 2009

Introduction à Spring AOP : gestion des logs

Je vous présente aujourd'hui un petit bout de code que j'utilise de temps en temps et qui, j'espère, pourra servir à d'autres personnes!

La technique présentée ici permet de ne pas polluer le code avec la gestion des logs. Dans cet exemple on ne logge que les appels de méthodes dans la couche service.
On crée un "pointcut" pour intercepter les appels de méthodes. A chaque appel intercepté on récupère le nom de la classe et de la méthode appelées, ainsi que les paramètres d'appel, afin d'inscrire tout ça dans les logs.

Configuration Spring














NB: si la conf xml ne s'affiche pas dans votre agrégateur, je vous invite à continuer sur le site.

L'expression '*com.coffeebean.example.services..*.*(..))' permet d'intercepter toutes les méthodes de toutes les classes se trouvant sous le package services.

Classe LogInterceptor

Cette classe permet de tracer les appels aux méthodes.


private Logger log;

/**
* Trace d'appel d'une méthode
*
* @param point
* @param result
* @throws Throwable
*/
public void logMethod(JoinPoint point) throws Throwable {
if (log == null)
log = LoggerFactory.getLogger(LogInterceptor.class);
Object[] args = point.getArgs();
String methodName = point.getTarget().getClass().getSimpleName() + "." + point.getSignature().getName();
StringBuffer sb = new StringBuffer(methodName + " appelée avec : [");
for (int i = 0; i < args.length; i++) {
Object o = args[i];
//on n'écrit pas le mot de passe dans les logs
if (!(methodName.equals("AutentificationService.connexion") && i == 1)){
sb.append("'" + o + "'");
sb.append((i == args.length - 1) ? "" : ", ");
}
else{
sb.append("?");
sb.append((i == args.length - 1) ? "" : ", ");
}
}
sb.append("]");
log.debug(sb.toString());
}