Log4j est un outil formidable dans le monde Java. Il permet a moindre cout de mettre en place au sein d’une application, un fichier de trace, permettant plusieurs niveau d’information. Mes collègues javaïstes seront forcément de mon avis. Aussi, pour qu’une application web puisse fournir son propre fichier de log, il est nécessaire de configurer dynamiquement le moteur de log4j. C’est le propos de cet article.

Capture1

figure 1 – Example de configuration XML pour Log4j.

Pour qu’une application fournisse sa propre configuration de Log4J et son propre fichier de log (et sa propre config) : (issue de http://www.avajava.com/tutorials/lessons/how-do-i-initialize-log4j-in-a-web-application.html)

La servlet d’initialisation de Log4J lors du démarrage du serveur Tomcat :

package test;import java.io.File;import javax.servlet.ServletConfig;import javax.servlet.ServletContext;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import org.apache.log4j.BasicConfigurator;import org.apache.log4j.PropertyConfigurator;public class Log4JInitServlet extends HttpServlet {     private static final long serialVersionUID = 1L;     public void init(ServletConfig config) throws ServletException {         System.out.println("Log4JInitServlet is initializing log4j");         String log4jLocation = config.getInitParameter("log4j-properties-location");         ServletContext sc = config.getServletContext();         if (log4jLocation == null) {              System.err.println("*** No log4j-properties-location init param, so initializing log4j with BasicConfigurator");              BasicConfigurator.configure();         } else {              String webAppPath = sc.getRealPath("/");              String log4jProp = webAppPath + log4jLocation;              File yoMamaYesThisSaysYoMama = new File(log4jProp);              if (yoMamaYesThisSaysYoMama.exists()) {                   System.out.println("Initializing log4j with: " + log4jProp);                   PropertyConfigurator.configure(log4jProp);              } else {                   System.err.println("*** " + log4jProp + " file not found, so initializing log4j with BasicConfigurator");                   BasicConfigurator.configure();              }         }         super.init(config);     }}

En rouge ci-dessous le tag servlet a insérer dans le fichier web.xml de démarrage de l’application.

<?xml version="1.0" encoding="UTF-8"?><web-app id="log4j-webapp-demo" version="2.4"     xmlns="http://java.sun.com/xml/ns/j2ee"     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"     xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">     <servlet>         <servlet-name>Log4JTestServlet</servlet-name>         <servlet-class>test.Log4JTestServlet</servlet-class>     </servlet>     <servlet>         <servlet-name>Log4JInitServlet</servlet-name>         <servlet-class>test.Log4JInitServlet</servlet-class>         <init-param>              <param-name>log4j-properties-location</param-name>              <param-value>WEB-INF/log4j.properties</param-value>         </init-param>         <load-on-startup>1</load-on-startup>     </servlet>     <servlet-mapping>         <servlet-name>Log4JTestServlet</servlet-name>         <url-pattern>/test</url-pattern>     </servlet-mapping></web-app>

Ainsi, on peut en plus spécifier l’emplacement dans l’application web du fichier de configuration de Log4J :

<init-param>     <param-name>log4j-properties-location</param-name>     <param-value>WEB-INF/log4j.properties</param-value></init-param>

Une autre servlet est proposée, permettant de tester log4j:

package test;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import org.apache.log4j.Logger;public class Log4JTestServlet extends javax.servlet.http.HttpServlet implements javax.servlet.Servlet {     private static final long serialVersionUID = 1L;     static Logger log = Logger.getLogger(Log4JTestServlet.class);     public Log4JTestServlet() {         super();     }     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {         response.setContentType("text/html");         PrintWriter out = response.getWriter();         out.println("Howdy");         log.debug("debug message");         log.info("info message");         log.warn("warn message");         log.error("error message");         log.fatal("fatal message");     }}

Ainsi en appelant une petite URL il est possible de provoquer une sortie test vers le log de l’application.

Attention à bien changer le package de ces deux classes, afin de les « ranger » proprement dans le projet.

Pour aller plus loin, il y a une version évoluée de la servlet d’initialisation permettant le rechargement de la configuration sans redémarrage du serveur/application : http://www.avajava.com/tutorials/lessons/how-do-i-change-my-log4j-settings-while-my-web-application-is-running.html

Publicités