SlideShare une entreprise Scribd logo
1  sur  12
Télécharger pour lire hors ligne
Comment répondre aux besoins de
            logs en production avec LOG4J ?



Fabien Baligand
                                      Copyright©Sfeir (D.GEN.315.V2)
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
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
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
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
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
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
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
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
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
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
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

Contenu connexe

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

Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfonyjeUXdiCode
 
Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx FranceMarc Bojoly
 
Gestion des LOGS savec syslog+loganalyzer
Gestion des LOGS savec syslog+loganalyzerGestion des LOGS savec syslog+loganalyzer
Gestion des LOGS savec syslog+loganalyzerMohamet Lamine DIOP
 
Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010Guillaume Sautereau
 
310119 Webinar Présentation Nouveautés 5.3
310119 Webinar Présentation Nouveautés 5.3310119 Webinar Présentation Nouveautés 5.3
310119 Webinar Présentation Nouveautés 5.3Everteam
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniterAtsé François-Xavier KOBON
 
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...GSoft
 
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshopImporter des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshopNuxeo
 
AFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIAFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIRomain Cambien
 
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...Franck Cornu
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipelineNicolas wallerand
 
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...Guillaume MOCQUET
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDOAbdoulaye Dieng
 
Powershell
PowershellPowershell
PowershellUGAIA
 
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014Benoît de CHATEAUVIEUX
 

Similaire à Comment répondre aux besoins de log en production avec log4j (20)

Perf university
Perf universityPerf university
Perf university
 
Drupal 8, symfony
Drupal 8, symfonyDrupal 8, symfony
Drupal 8, symfony
 
Université de la performance - Devoxx France
Université de la performance - Devoxx FranceUniversité de la performance - Devoxx France
Université de la performance - Devoxx France
 
Introduction à Symfony
Introduction à SymfonyIntroduction à Symfony
Introduction à Symfony
 
Gestion des LOGS savec syslog+loganalyzer
Gestion des LOGS savec syslog+loganalyzerGestion des LOGS savec syslog+loganalyzer
Gestion des LOGS savec syslog+loganalyzer
 
Introduction à Symfony
Introduction à SymfonyIntroduction à Symfony
Introduction à Symfony
 
iTunes Stats
iTunes StatsiTunes Stats
iTunes Stats
 
spring.pdf
spring.pdfspring.pdf
spring.pdf
 
Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010Présentation de CakePHP, 22/04/2010
Présentation de CakePHP, 22/04/2010
 
310119 Webinar Présentation Nouveautés 5.3
310119 Webinar Présentation Nouveautés 5.3310119 Webinar Présentation Nouveautés 5.3
310119 Webinar Présentation Nouveautés 5.3
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
 
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshopImporter des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
Importer des données dans Nuxeo Platform - Nuxeo Tour 2014 - workshop
 
AFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open APIAFUP Aix/Marseille - 16 mai 2017 - Open API
AFUP Aix/Marseille - 16 mai 2017 - Open API
 
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
Automatiser le déploiement d'environnements SharePoint 2010/2013 grâce à Powe...
 
Chaine de production pipeline
Chaine de production   pipelineChaine de production   pipeline
Chaine de production pipeline
 
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
[Sildes] plateforme centralisée d’analyse des logs des frontaux http en temps...
 
php2 : formulaire-session-PDO
php2 : formulaire-session-PDOphp2 : formulaire-session-PDO
php2 : formulaire-session-PDO
 
Powershell
PowershellPowershell
Powershell
 
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
"La Performance en Continue" à JMaghreb 3.0 - 05/11/2014
 

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

  • 1. Comment répondre aux besoins de logs en production avec LOG4J ? Fabien Baligand Copyright©Sfeir (D.GEN.315.V2)
  • 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