Normalmente deseamos que cada aplicativo web maneje un log de errores independiente al del servidor de aplicaciones y para ellos utilizaremos log4j. log4j es una librería adicional de java que permite a nuestra aplicación mostrar mensajes de información de lo que está sucediendo en ella, lo que habitualmente se conoce como un log. La librería la podemos descargar del siguiente enlace: http://logging.apache.org/log4j/2.x/

La versión de log4j que utilizo es la log4j-1.2.17.jar y los pasos para la implementación en el aplicativo son los siguientes.

1. Agregar la librería al proyecto.

log4j-jar2. Crear el archivo “log4j.xml”

log4j-xml3. A continuación enseño la configuración, para que el log4j genere log por consola(CONSOLE), archivo independiente(STDOUT) y por correo(MAIL).

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
    <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">
        <param name="Target" value="System.out"/>
        <param name="Threshold" value="INFO" />
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c %x - %m%n"/>
        </layout>
    </appender>
    <!-- log all logs to a separate log file every day -->
    <appender name="STDOUT" class="org.apache.log4j.RollingFileAppender">
        <param name="File" value="${catalina.base}/logs/biblioteca-web.log" />
        <param name="Threshold" value="INFO" />
        <param name="Append" value="true" />
        <param name="MaxFileSize" value="1MB" />   
        <param name="MaxBackupIndex" value="20" />   
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} [%t] %-5p %c %x - %m%n"/>
        </layout>
    </appender>    
    <appender name="MAIL" class="org.apache.log4j.net.SMTPAppender">
        <param name="BufferSize" value="512" />
        <param name="SMTPHost" value="mail.prueba.edu.co" />        
        <param name="SMTPUsername" value="usuario" />
        <param name="SMTPPassword" value="clave" />
        <param name="From" value="soporte@mail.prueba.edu.co" />
        <param name="To" value="javier.mantilla@prueba.edu.co" />
        <param name="Subject" value="[ERROR LOG BIBLIOTECA/WEB] ErrorList" />                
        <layout class="org.apache.log4j.PatternLayout">
            <param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />            
        </layout>        
        <filter class="org.apache.log4j.varia.LevelRangeFilter">
            <param name="LevelMin" value="error" />
            <param name="LevelMax" value="fatal" />
        </filter>        
    </appender>          
    <root>
        <priority value ="INFO" />
        <appender-ref ref="STDOUT" />
        <appender-ref ref="CONSOLE" />
        <appender-ref ref="MAIL" />
    </root>  
</log4j:configuration>

Lo interesante aquí son los parámetros de configuración del STDOUT, MAIL. En el de generar el archivo en el parámetro “File” se le indica que se cree en el directorio “logs” donde se encuentra el servidor de aplicaciones TOMEE ( value=”${catalina.base}/logs/biblioteca-web.log” ) y el nombre del archivo a generar es “biblioteca-web.log” y en los parámetros de MAIL son los valores de configuración del servidor de correo.

La implementación el la clase de java sería la siguiente:

package org.upbbga.biblioteca.backingbean.forms;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.apache.log4j.Logger;
/**
 * Clase encargada del logueo a la aplicación.
 * @author javier.mantilla
 */
@ManagedBean
@ViewScoped
public class LoginFormBean implements Serializable {
    /**
     * Logger de log4j.
     */
    private static final Logger LOGGER = Logger.getLogger(LoginFormBean.class);

    public void envioIngresar() {
        try {
            if (!Boolean.parseBoolean(
                 UtilRecursosVista.getStringRecursos("ldap_autenticacion"))) {
                this.autenticarSistemaBiblioteca();
            } else {
                this.autenticarLdap();
            }
        } catch (UPBException e) {
            JsfUtil.addErrorMessage(JsfUtil.getMensajeError());
            LOGGER.error("Método envioIngresar -->" + e.getMessage(), e);
        }
        RequestContext.getCurrentInstance().update("msg");
    }
}

Se declara la variable de tipo Logger y en los métodos se hace la implementación. Cuando ocurra una “exception” según el archivo de configuración generaría un correo informando sobre el error y adicionalmente se agregara el error al archivo mencionado en el log4j.xml.

Espero que haya sido claro. cualquier inquietud enviarme un correo.

Deja un comentario

Tu dirección de correo electrónico no será publicada.