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

Preview:

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

Recommended