12

Click here to load reader

Comment répondre aux besoins de log en production avec log4j

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

Page 1: Comment répondre aux besoins de log en production avec log4j

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

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

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

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

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

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

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

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

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

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

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

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