Click here to load reader
Upload
fabien-baligand
View
1.915
Download
4
Embed Size (px)
DESCRIPTION
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.
Citation preview
Comment répondre aux besoins de logs en production avec LOG4J ?
Copyright©Sfeir (D.GEN.315.V2) Fabien Baligand
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
2
Besoins de logs en production
� 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
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
3
Solutions
� 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
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
4
Résultat obtenu
INFO;john;103;NEWREQUEST;/Compte/Consulter
INFO;john;103;BDD1;select * from user where id=?;48
INFO;john;103;WebService1;getListeDesComptes;79
INFO;john;103;HTTPREQUEST;/Compte/Consulter;135
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
5
Résultat obtenu (entrelacement)
INFO;john;103;NEWREQUEST;/Compte/Consulter
INFO;john;103;BDD1;select * from user where id=?;48
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
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
6
Résultat obtenu (cas d ’erreur)
INFO;john;103;NEWREQUEST;/Compte/Consulter
INFO;john;103;BDD1;select * from user where id=?;48
ERROR;john;103;WebService1;getListeDesComptes;2530
<stacktrace>
ERROR;john;103;HTTPREQUEST;/Compte/Consulter;2585
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
7
Mise en oeuvre technique
� Un filtre (au sens Servlet 2.3) :
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)
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
8
Code du filtre
// on lance le chrono
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 HT TP
LOG.info("NEWREQUEST;" + request.getRequestURI());
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
9
Code du filtre (suite)
// On passe la main à la suite de la FilterChain
filterChain.doFilter(request, response);
// On logge le temps d'exécution
executionTime = System.currentTimeMillis() - executi onTime;
LOG.info("HTTPREQUEST;" + request.getRequestURI() + ";" + executionTime);
}
catch (Exception e) {
// on logge l'erreur
executionTime = System.currentTimeMillis() - executi onTime;
LOG.error("HTTPREQUEST ;" + request.getRequestURI() + ";" + executionTime, e);
}
finally {
// on libère le ThreadLocal
MDC.remove("requestId");
MDC.remove("login");
}
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
10
Configuration LOG4J
log4j.rootCategory= ERROR,console
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
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
11
Log des appels Back -End
� Plusieurs possibilités :
� 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
Cliquez pour ajouter un titre
• Cliquez pour ajouter un plan
12
Quels contextes ?
� 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