Présente comment on peut répondre aux besoins de logs en production, concernant l'analyse de problèmes isolés ou la mesure des performances, grâce à la corrélation de logs, simplifiée avec log4j.
2. Cliquez pour ajouter un titre
Besoins de logs en production
• Cliquez pour ajouter un plan
Debugging
Être capable de retrouver un problème remonté par
un client dans les logs
Être capable de retrouver l’ensemble du contexte qui
a amené au problème remonté et à l’erreur constatée
Mesure de la performance et de la charge :
Connaissance des performances et de la charge
Statistiques et mesures de l’évolution
Détection des éléments non performants
2
3. Cliquez pour ajouter un titre
Solutions
• Cliquez pour ajouter un plan
Debugging
Mettre en place de la corrélation de logs, au moyen
de LOG4J, en préfixant chaque ligne de log par :
le login de l’utilisateur connecté
un identifiant unique de requête HTTP
Mesure de la performance et de la charge :
Log du temps d’exécution de chaque requête HTTP
entrante
Log du temps d’exécution de chaque requête
envoyée aux Back-Ends accédés (Base de Données,
Annuaires LDAP, Web Services, …)
Ecrire chaque ligne de log au format CSV
3
4. Cliquez pour ajouter un titre
Résultat obtenu
• Cliquez pour ajouter *un planwhere id=?;48
INFO;john;103;NEWREQUEST;/Compte/Consulter
INFO;john;103;BDD1;select from user
INFO;john;103;WebService1;getListeDesComptes;79
INFO;john;103;HTTPREQUEST;/Compte/Consulter;135
4
5. Cliquez pour ajouter un titre
Résultat obtenu (entrelacement)
• Cliquez pour ajouter *un planwhere id=?;48
INFO;john;103;NEWREQUEST;/Compte/Consulter
INFO;john;103;BDD1;select from user
INFO;kate;104;NEWREQUEST;/Compte/Consulter
INFO;john;103;WebService1;getListeDesComptes;79
INFO;kate;104;BDD1;select * from user where id=?;43
INFO;john;103;HTTPREQUEST;/Compte/Consulter;135
INFO;kate;104;WebService1;getListeDesComptes;74
INFO;kate;104;HTTPREQUEST;/Compte/Consulter;125
5
6. Cliquez pour ajouter un titre
Résultat obtenu (cas d’erreur)
• Cliquez pour ajouter *un planwhere id=?;48
INFO;john;103;NEWREQUEST;/Compte/Consulter
INFO;john;103;BDD1;select from user
ERROR;john;103;WebService1;getListeDesComptes;2530
<stacktrace>
ERROR;john;103;HTTPREQUEST;/Compte/Consulter;2585
6
7. Cliquez pour ajouter un titre
Mise en oeuvre technique
• Cliquez pour (au sens Servlet 2.3) :
Un filtre ajouter un plan
en frontal de l’application web, injectant les informations
de corrélation à LOG4J (login + requestId), et loggant
les appels HTTP
Une configuration LOG4J :
préfixant chaque ligne de log par les informations de
corrélation (login + requestId)
7
8. Cliquezdu filtre ajouter un titre
Code pour
// on lance le chrono
• Cliquez pour ajouter un plan
long executionTime = System.currentTimeMillis();
try {
// on assigne le numéro unique de la requête HTTP
String requestId = getRequestId();
// on récupère le login de l'utilisateur connecté
String login = (String) session.getAttribute("LOGIN");
// on renseigne à Log4J le numéro de requete HTTP et le login de
l'utilisateur
MDC.put("requestId", requestId);
MDC.put("login", login);
// on logge le début de traitement de la requête HTTP
LOG.info("NEWREQUEST;" + request.getRequestURI());
8
9. Cliquezdu filtre ajouter un titre
Code pour (suite)
// On passe la main à la suite de la FilterChain
• Cliquez pour ajouter un plan
filterChain.doFilter(request, response);
// On logge le temps d'exécution
executionTime = System.currentTimeMillis() - executionTime;
LOG.info("HTTPREQUEST;" + request.getRequestURI() + ";" + executionTime);
}
catch (Exception e) {
// on logge l'erreur
executionTime = System.currentTimeMillis() - executionTime;
LOG.error("HTTPREQUEST ;" + request.getRequestURI() + ";" + executionTime, e);
}
finally {
// on libère le ThreadLocal
MDC.remove("requestId");
MDC.remove("login");
}
9
10. Cliquez pour ajouter un titre
Configuration LOG4J
log4j.rootCategory=ERROR,console
• Cliquez pour ajouter un plan
log4j.logger.filter.LogCorrelationFilter=INFO
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%p;%X{login};%X{requestId};%m%n
10
11. Cliquez pour ajouter un titre
Log des appels Back-End
• Cliquez pour ajouter un :
Plusieurs possibilités plan
Utilisation d’un composant central pour les appels
Back-End loggant tous les appels
Utilisation d’un dynamic proxy
Utilisation d’un decorator
Utilisation d’AOP
11
12. Cliquezcontextes ?
Quels pour ajouter un titre
• Cliquez pour ajouter un plan
Tous les contextes sont possibles :
Application web
Web Service
Portail & Portlets
Le principe peut tout à fait être mis en place pour des
usages autres que web
12