<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>MilamberSpace &#187; Java</title>
	<atom:link href="http://blog.milamberspace.net/index.php/tag/java/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.milamberspace.net</link>
	<description>JMeter (surtout) mais aussi l&#039;Informatique, Internet, etc.</description>
	<lastBuildDate>Wed, 14 Jul 2010 06:34:50 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Utilisation de NDC de Apache Log4J pour tracer et suivre l&#8217;exécution d&#8217;une application Java</title>
		<link>http://blog.milamberspace.net/index.php/2008/01/15/utilisation-de-ndc-de-apache-log4j-pour-tracer-et-suivre-lexecution-dune-application-java-58.html</link>
		<comments>http://blog.milamberspace.net/index.php/2008/01/15/utilisation-de-ndc-de-apache-log4j-pour-tracer-et-suivre-lexecution-dune-application-java-58.html#comments</comments>
		<pubDate>Tue, 15 Jan 2008 20:46:38 +0000</pubDate>
		<dc:creator>Milamber</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Développement]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JEE]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Log4J]]></category>
		<category><![CDATA[Supervision]]></category>
		<category><![CDATA[NDC]]></category>

		<guid isPermaLink="false">http://blog.milamberspace.net/index.php/2008/01/15/utilisation-de-ndc-de-apache-log4j-pour-tracer-et-suivre-lexecution-dune-application-java-58.html</guid>
		<description><![CDATA[Un fonctionnalité pratique du framework de logging Apache Log4J est le NDC (pour  Nested Diagnostic Contexts). Ce dernier permet de tracer et suivre plusieurs instances d&#8217;un même traitement dans un seul fichier de log. Une utilisation typique est le fichier de log d&#8217;une application web s&#8217;exécutant sur un serveur d&#8217;applications, car plusieurs instances d&#8217;une [...]]]></description>
			<content:encoded><![CDATA[<p>Un fonctionnalité pratique du framework de logging Apache Log4J est le NDC (<em>pour  Nested Diagnostic Contexts</em>). Ce dernier permet de tracer et suivre plusieurs instances d&#8217;un même traitement dans un seul fichier de log. Une utilisation typique est le fichier de log d&#8217;une application web s&#8217;exécutant sur un serveur d&#8217;applications, car plusieurs instances d&#8217;une même servlet (et de plusieurs servlets) s&#8217;exécutent en même temps pour servir les utilisateurs.</p>
<p>La fonctionnalité permet donc de mieux comprendre le déroulement d&#8217;un traitement, en particulier lors qu&#8217;un problème survient lors d&#8217;un tir de charges ou sur un environnement en production. Et imaginons que ce problème &#8216;ne se reproduit pas&#8217; en environnement de recette / développement, et donc l&#8217;origine pourrait être ces accès multiples en même temps&#8230;<span id="more-58"></span></p>
<p>Un développeur seul sur sa machine génère que un seul log séquentiel, mais avec de multiples utilisateurs, le log devient un enchevêtrement de plusieurs traitements séquentiels.</p>
<p><u>Voici un exemple de log applicatif pendant un tir de charges :</u></p>
<pre>[2008-01-15 20:31:50,750][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,755][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@1ba287e
[2008-01-15 20:31:50,757][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list
[2008-01-15 20:31:50,758][DEBUG] (JndiJdbcTableView.java:62) - doGet() - Mise en attribut resultat
[2008-01-15 20:31:50,758][DEBUG] (JndiJdbcTableView.java:64) - doGet() - Renvoi vers JSP
[2008-01-15 20:31:50,759][DEBUG] (JndiJdbcTableView.java:78) - doGet() - end
[2008-01-15 20:31:50,768][DEBUG] (JndiJdbcWithValidationTableView.java:48) - doGet() - start
[2008-01-15 20:31:50,769][INFO ] (JndiJdbcWithValidationTableView.java:56) - doGet() - Ok connexion
[2008-01-15 20:31:50,769][DEBUG] (JndiJdbcWithValidationTableView.java:60) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,770][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,775][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@1d2f8be
[2008-01-15 20:31:50,776][INFO ] (DirectJdbcTableView.java:60) - doGet() - Ok connexion
[2008-01-15 20:31:50,777][DEBUG] (DirectJdbcTableView.java:64) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,777][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,775][INFO ] (DirectJdbcTableView.java:60) - doGet() - Ok connexion
[2008-01-15 20:31:50,778][DEBUG] (DirectJdbcTableView.java:64) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,778][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,780][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list
[2008-01-15 20:31:50,780][DEBUG] (JndiJdbcWithValidationTableView.java:62) - doGet() - Mise en attribut resultat
[2008-01-15 20:31:50,780][DEBUG] (JndiJdbcWithValidationTableView.java:64) - doGet() - Renvoi vers JSP
[2008-01-15 20:31:50,783][DEBUG] (JndiJdbcWithValidationTableView.java:78) - doGet() - end
[2008-01-15 20:31:50,784][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; com.mysql.jdbc.ResultSet@10de02d
[2008-01-15 20:31:50,786][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list
[2008-01-15 20:31:50,786][DEBUG] (DirectJdbcTableView.java:66) - doGet() - Mise en attribut resultat
[2008-01-15 20:31:50,787][DEBUG] (DirectJdbcTableView.java:68) - doGet() - Renvoi vers JSP
[2008-01-15 20:31:50,788][DEBUG] (DirectJdbcTableView.java:85) - doGet() - end
[2008-01-15 20:31:50,789][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; com.mysql.jdbc.ResultSet@172c403
[2008-01-15 20:31:50,786][INFO ] (DirectJdbcTableView.java:60) - doGet() - Ok connexion
[2008-01-15 20:31:50,791][DEBUG] (DirectJdbcTableView.java:64) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,791][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,792][DEBUG] (JndiJdbcWithValidationTableView.java:48) - doGet() - start
[2008-01-15 20:31:50,792][INFO ] (JndiJdbcWithValidationTableView.java:56) - doGet() - Ok connexion
[2008-01-15 20:31:50,793][DEBUG] (JndiJdbcWithValidationTableView.java:60) - doGet() - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:31:50,793][DEBUG] (DaoBoxers.java:24) - bdSelectAll() - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:31:50,794][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list
[2008-01-15 20:31:50,794][DEBUG] (DirectJdbcTableView.java:66) - doGet() - Mise en attribut resultat
[2008-01-15 20:31:50,795][DEBUG] (DirectJdbcTableView.java:68) - doGet() - Renvoi vers JSP
[2008-01-15 20:31:50,796][DEBUG] (DirectJdbcTableView.java:85) - doGet() - end
[2008-01-15 20:31:50,798][DEBUG] (DaoBoxers.java:27) - bdSelectAll() - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@695586
[2008-01-15 20:31:50,799][DEBUG] (DaoBoxers.java:36) - bdSelectAll() - Retour list</pre>
<p>La fonctionnalité NDC ajoute la possibilité d&#8217;avoir un « identifiant » de traitement, par exemple le nombre de secondes depuis le 1er janvier 1970. Ainsi le log devient un enchevêtrement de traitements séquentiels identifiés.<br />
<u> Et voici un exemple de log applicatif avec NDC :</u></p>
<pre>[2008-01-15 20:07:55,920][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#339966">1200427675911</font>) - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@19e907
[2008-01-15 20:07:55,921][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#339966">1200427675911</font>) - Retour list
[2008-01-15 20:07:55,922][DEBUG] (JndiJdbcWithValidationTableView.java:62) - doGet(<font color="#339966">1200427675911</font>) - Mise en attribut resultat
[2008-01-15 20:07:55,922][DEBUG] (JndiJdbcWithValidationTableView.java:64) - doGet(<font color="#339966">1200427675911</font>) - Renvoi vers JSP
[2008-01-15 20:07:55,924][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#ff6600">1200427675917</font>) - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@93a96c
[2008-01-15 20:07:55,925][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#ff6600">1200427675917</font>) - Retour list
[2008-01-15 20:07:55,926][DEBUG] (JndiJdbcWithValidationTableView.java:62) - doGet(<font color="#ff6600">1200427675917</font>) - Mise en attribut resultat
[2008-01-15 20:07:55,926][DEBUG] (JndiJdbcWithValidationTableView.java:64) - doGet(<font color="#ff6600">1200427675917</font>) - Renvoi vers JSP
[2008-01-15 20:07:55,927][DEBUG] (JndiJdbcWithValidationTableView.java:78) - doGet(<font color="#339966">1200427675911</font>) - end
[2008-01-15 20:07:55,929][DEBUG] (DirectJdbcTableView.java:49) - doGet(<font color="#0000ff">1200427675929</font>) - start
[2008-01-15 20:07:55,931][DEBUG] (JndiJdbcWithValidationTableView.java:78) - doGet(<font color="#ff6600">1200427675917</font>) - end
[2008-01-15 20:07:55,934][DEBUG] (DirectJdbcInInitTableView.java:49) - doGet(<font color="#ff00ff">1200427675934</font>) - start
[2008-01-15 20:07:55,938][DEBUG] (JndiJdbcWithValidationTableView.java:48) - doGet(<font color="#ff0000">1200427675938</font>) - start
[2008-01-15 20:07:55,938][INFO ] (JndiJdbcWithValidationTableView.java:56) - doGet(<font color="#ff0000">1200427675938</font>) - Ok connexion
[2008-01-15 20:07:55,939][DEBUG] (JndiJdbcWithValidationTableView.java:60) - doGet(<font color="#ff0000">1200427675938</font>) - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:07:55,941][DEBUG] (net.milamberspace.dao.DaoBoxers.java:24) - bdSelectAll(<font color="#ff0000">1200427675938</font>) - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:07:55,941][INFO ] (DirectJdbcTableView.java:60) - doGet(<font color="#0000ff">1200427675929</font>) - Ok connexion
[2008-01-15 20:07:55,942][DEBUG] (DirectJdbcTableView.java:64) - doGet(<font color="#0000ff">1200427675929</font>) - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:07:55,942][DEBUG] (DaoBoxers.java:24) - bdSelectAll(<font color="#0000ff">1200427675929</font>) - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:07:55,947][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#ff0000">1200427675938</font>) - ResultSet ok =&gt; org.apache.tomcat.dbcp.dbcp.DelegatingResultSet@17dde01
[2008-01-15 20:07:55,948][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#ff0000">1200427675938</font>) - Retour list
[2008-01-15 20:07:55,949][DEBUG] (JndiJdbcWithValidationTableView.java:62) - doGet(<font color="#ff0000">1200427675938</font>) - Mise en attribut resultat
[2008-01-15 20:07:55,949][DEBUG] (JndiJdbcWithValidationTableView.java:64) - doGet(<font color="#ff0000">1200427675938</font>) - Renvoi vers JSP
[2008-01-15 20:07:55,950][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#0000ff">1200427675929</font>) - ResultSet ok =&gt; com.mysql.jdbc.ResultSet@7a3c6c
[2008-01-15 20:07:55,952][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#0000ff">1200427675929</font>) - Retour list
[2008-01-15 20:07:55,952][DEBUG] (DirectJdbcTableView.java:66) - doGet(<font color="#0000ff">1200427675929</font>) - Mise en attribut resultat
[2008-01-15 20:07:55,952][DEBUG] (DirectJdbcTableView.java:68) - doGet(<font color="#0000ff">1200427675929</font>) - Renvoi vers JSP
[2008-01-15 20:07:55,954][DEBUG] (DirectJdbcTableView.java:85) - doGet(<font color="#0000ff">1200427675929</font>) - end
[2008-01-15 20:07:55,956][INFO ] (DirectJdbcInInitTableView.java:57) - doGet(<font color="#ff00ff">1200427675934</font>) - Ok connexion
[2008-01-15 20:07:55,956][DEBUG] (DirectJdbcInInitTableView.java:61) - doGet(<font color="#ff00ff">1200427675934</font>) - Appel Boxers =&gt; bdSelectAll
[2008-01-15 20:07:55,957][DEBUG] (DaoBoxers.java:24) - bdSelectAll(<font color="#ff00ff">1200427675934</font>) - SQL =&gt; SELECT ID, PRENOM, NOM FROM BOXERS
[2008-01-15 20:07:55,958][DEBUG] (JndiJdbcWithValidationTableView.java:78) - doGet(<font color="#ff0000">1200427675938</font>) - end
[2008-01-15 20:07:55,961][DEBUG] (DaoBoxers.java:27) - bdSelectAll(<font color="#ff00ff">1200427675934</font>) - ResultSet ok =&gt; com.mysql.jdbc.ResultSet@283198
[2008-01-15 20:07:55,963][DEBUG] (DaoBoxers.java:36) - bdSelectAll(<font color="#ff00ff">1200427675934</font>) - Retour list</pre>
<p>Cela permet une lecture plus facile des logs (la couleur n&#8217;est pas incluse <img src='http://blog.milamberspace.net/wp-includes/images/smilies/icon_wink.gif' alt=';-)' class='wp-smiley' /> ), dès lors que l&#8217;on sait utiliser la commande grep sous Unix en faisant quelques petits grep sur l&#8217;identifiant. (par exemple : grep 1200426850018 mon_log.txt)</p>
<p>Comme faire pour utiliser NDC ? Et bien tout d&#8217;abord dans le fichier de configuration de Log4J, le fameux log4j.properties. Il faut ajouter la balise « %x » dans le ConversionPattern, celle-ci sera remplacée par l&#8217;identifiant unique défini lors de l&#8217;utilisation de NDC.</p>
<p><u>Exemple de fichier log4j.properties</u></p>
<pre><font color="#800000">log4j.rootLogger=DEBUG, LOG1
log4j.appender.LOG1=org.apache.log4j.ConsoleAppender
log4j.appender.LOG1.layout=org.apache.log4j.PatternLayout
log4j.appender.LOG1.layout.ConversionPattern=[%d][%-5p] (%C.java:%L) - %M(<strong>%x</strong>) - %m%n</font></pre>
<p>Au niveau du code source Java, on utilisera deux méthodes de la classe statique NDC.</p>
<ul>
<li><em>NDC.push(String ID)</em> qui permet de poser un identifiant</li>
<li><em>NDC.pop()</em> qui permet de dépiler le dernier identifiant posé</li>
</ul>
<p>Voici un exemple simple d&#8217;utilisation pour une servlet, avec ici, l&#8217;utilisation de « new Date().getTime() » comme identifiant :</p>
<pre>protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
 NDC.push(String.valueOf(new Date().getTime()));
 logger.debug("start");
 Connection connection = null;
 try {
 	connection = getDataSource().getConnection();
 	logger.info("Ok connexion");
	DaoBoxers dao = new DaoBoxers();
 	dao.setConnection(connection);
 	ArrayList<boxer> list = dao.bdSelectAll();
 	request.setAttribute("beanListeBoxer", list);
 	this.getServletContext().getRequestDispatcher("/tableview.jsp").forward(request, response);
</boxer> } catch (Exception e) {
 	logger.error(e);
 	throw new ServletException(e.getMessage());
 } finally {
 	try {
 		connection.close();
 	} catch (SQLException sqle) {
 		logger.error(sqle);
 	}
 	logger.debug("end");
 	NDC.pop();
 }
}</pre>
<p>Bien entendu, les appels à logger.xxxx() dans les méthodes du DAO vont également bénéficier de l&#8217;identifiant NDC.</p>
<p>Espérons que ce billet vous sera utile.</p>
<p><em>La page de<a href="http://logging.apache.org/log4j/1.2/manual.html" target="_blank"> manuel de Log4J</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.milamberspace.net/index.php/2008/01/15/utilisation-de-ndc-de-apache-log4j-pour-tracer-et-suivre-lexecution-dune-application-java-58.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
