comment répondre aux besoins de log en production avec log4j
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.TRANSCRIPT
![Page 1: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/1.jpg)
Comment répondre aux besoins de logs en production avec LOG4J ?
Copyright©Sfeir (D.GEN.315.V2) Fabien Baligand
![Page 2: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/2.jpg)
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
![Page 3: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/3.jpg)
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
![Page 4: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/4.jpg)
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
![Page 5: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/5.jpg)
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
![Page 6: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/6.jpg)
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
![Page 7: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/7.jpg)
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)
![Page 8: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/8.jpg)
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());
![Page 9: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/9.jpg)
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");
}
![Page 10: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/10.jpg)
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
![Page 11: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/11.jpg)
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
![Page 12: Comment répondre aux besoins de log en production avec log4j](https://reader038.vdocuments.pub/reader038/viewer/2022100507/55843454d8b42a77068b48c9/html5/thumbnails/12.jpg)
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