sábado, 18 de junio de 2016

Log4j 2.6.1 Parte I

Bueno Ahora trabaremos con la librería log4j 2.6.1; esta librería nos permitirá dejar trazabilidad de los eventos que realicemos en nuestro proyecto. Hay varias maneras de configurar esto, pero en esta ocasión realizaremos usando el archivo properties (la mas empleada)  y la mas amigable  de manera personal.


Nuestro ambiente de trabajo sera: JDK 1.8 (Descargar de la pagina oficial de Oracle)
Log4j 2.6.1 (jar) (Descargar de AQUI)
Eclipse (En mi caso estoy usando el STS, es lo mismo es una variante.)
Sistema Operativo: Windows 7 64 bits


Bueno, Cabe recordar vamos a configurar log4j versión 2.6.1 con un archivo .properties, también se puede configurar con una archivo .xml; pero nosotros lo realizaremos con el properties (Personalmente me parece mas legible y fácil)

Empezamos creando un proyecto JAVA desde cero.
Click en FILE -> New -> Java Project




Elegimos un nombre para nuestro proyecto, esta seleccionado Java 1.8 y luego presionamos FINALIZAR (Recordar log4j 2.6.1 soporta a partir de java 1.7 hacia adelante)


Listo Hicimos lo mas difícil, crear el proyecto =). Ahora hay que vamos a usar la librería de log4j, click derecho sobre el proyecto -> New -> Folder (Crearemos un folder donde se alojara las librerías de nuestro proyecto)

Aparece el siguiente cuadro, llamaremos "lib" a nuestro folder, estará ubicado en nuestro proyecto luego presionamos el botón "FINISH"



Listo, ahora, vamos donde están las librerías de log4j 2.6.1. Si descargamos de la pagina oficial, vamos a observar varias .jar; pero solo necesitamos 2, lo seleccionamos, click derecho Copiar.

Los 2 JAR de log4j 2.6.1 se puede descargar desde AQUI.


Nos dirigimos a nuestro proyecto y en la carpeta "lib" que hemos creado, sobre ella damos un click derecho y seleccionamos pegar ("paste")



Listo, nos queda así, por el momento; ¿Que hemos hecho? Bueno hasta el momento hemos creado una carpeta "lib dentro de nuestro proyecto" en esta carpeta se alojara todas las librerías que usemos en el proyecto; cuando exportemos el proyecto, o llevemos nuestro proyecto a otro sitio nos aseguramos de llevar las librerías que necesita. ¿Y ahora que sigue?...


Ahora que las librerías están dentro de nuestro proyecto, hay que decirle a JAVA donde esta, ¿no es adivino? así que le vamos a decir a nuestro proyecto donde se encuentra las librerías, es decir vamos a hacer referencia. Click derecho sobre el proyecto, y elegimos propiedades (properties)


Se visualiza el siguiente cuadro, en la parte izquierda seleccionamos "Java Build Path", luego en la parte central seleccionamos en la parte central la pestaña "Libraries" y por ultimo en la parte derecha damos click en el botón "Add JARs..."



Se muestra el siguiente cuadro, buscamos en nuestro proyecto la carpeta lib, seleccionamos las dos librerías que vamos a necesitar; luego presionamos el botón OK



Luego se visualiza en la pestaña de la parte central (Libraries) que se ha referenciado las librerías que vamos a emplear es decir con esto le decimos a nuestro proyecto donde están las librerías. =). Finalizamos presionado el botón OK

¡Listo!, ahora empecemos a configurar.... En nuestro proyecto vamos a la carpeta src (carpeta raíz de nuestro proyecto) damos un click derecho, y seleccionamos el archivo FILE


Aparece esta pantalla, y escribimos el nombre del archivo, lo llamaremos, "log4j2.properties" y luego presionamos el botón FINISH.



Queda algo así:



Listo, haber Aquí si debemos tener dos consideraciones, para que no tengas error, respecto a la libreria log4j 2;

Primero: El archivo de configuración properties tiene que estar creado en la carpeta raíz "src" de lo contrario no lo va encontrar, avisado están. =)

Segundo: El nombre del archivo de configuración, tiene que ser si o si "log4j2.properties", si tu le pones "log4j.properties" el proyecto no lo va encontrar.

Bueno Ahora vamos al proyecto y abrimos el archivo de configuración de log4j2, en la parte inferior hay 2 pestañas (Properties, Source), bueno nosotros seleccionamos Código (Source), Así es, buena observación esta vació, ni una linea de código, no nos asustemos...


Ahora vamos a realizar un desgaste mental tremendo, prepárense, vamos a copiar y pegar :D
Vamos a la pagina oficial de Apache en la documentación de log4j2 AQUI
Así es ahí esta la pancha, chuleta, el plaje, etc como se diga en su país. Copiamos todo ese código.

Lo podemos copiar de aquí también:
status = error
name = PropertiesConfig
 
property.filename = target/rolling/rollingtest.log
 
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
 
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %m%n
 
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = target/rolling2/test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5
 
appender.list.type = List
appender.list.name = List
appender.list.filter.threshold.type = ThresholdFilter
appender.list.filter.threshold.level = error
 
logger.rolling.name = com.example.my.app
logger.rolling.level = debug
logger.rolling.additivity = false
logger.rolling.appenderRef.rolling.ref = RollingFile
 
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = STDOUT



Luego Copiamos todo ello en el archivo log4j2.properties,

Estamos cerca......
Vamos hace una acotación, primero vamos ha realizar una configuración básica, luego vamos a explicar a un poco mas de detalle que hace cada linea para entender y a la par cambiar este archivo inicial. Eso ya va dependiendo de uno y sus necesidades.

En alguna parte de nuestra unidad en windows vamos a crear una carpeta para alojar, guardar nuestros log. En mi caso sera aquí (E:\carpetalog), puede ser en cualquier lugar que tu desees con el nombre que mas te guste.


Listo, una vez que sabemos donde se va a guardar nuestros archivos los, vamos al archivo de configuración log4j2.properties vamos a realizar dos modificaciones de la configuración, la ruta, guardamos y listo.


Consideraciones:

\\ Tiene que ser así: eso representa en Windows "\"

El nombre de nuestro archivo de salida estamos llamando: "logfile.log" puede tener el nombre que mas te guste.

En la linea 17: esto es cuando comprima los archivos, esto se explicara mas adelante. Por el momento asegúrate de la ruta.

De la linea 29 a la 37 del archivo anterior lo hemos eliminado, si lo conservas y no borras, te va salir error.

Al final queda así el código:

status = error
name = PropertiesConfig
 
property.filename = E:\\filelog\\logfile.log
 
filter.threshold.type = ThresholdFilter
filter.threshold.level = debug
 
appender.console.type = Console
appender.console.name = STDOUT
appender.console.layout.type = PatternLayout
appender.console.layout.pattern = %m%n
 
appender.rolling.type = RollingFile
appender.rolling.name = RollingFile
appender.rolling.fileName = ${filename}
appender.rolling.filePattern = E:\\filelog\\test1-%d{MM-dd-yy-HH-mm-ss}-%i.log.gz
appender.rolling.layout.type = PatternLayout
appender.rolling.layout.pattern = %d %p %C{1.} [%t] %m%n
appender.rolling.policies.type = Policies
appender.rolling.policies.time.type = TimeBasedTriggeringPolicy
appender.rolling.policies.time.interval = 2
appender.rolling.policies.time.modulate = true
appender.rolling.policies.size.type = SizeBasedTriggeringPolicy
appender.rolling.policies.size.size=100MB
appender.rolling.strategy.type = DefaultRolloverStrategy
appender.rolling.strategy.max = 5
 
rootLogger.level = info
rootLogger.appenderRef.stdout.ref = RollingFile




¡Listo!. Ahora crearemos una clase para probar. Click derecho sobre la carpeta "src"

New -> Class




Crearemos un Package, en mi caso sera el que se muestra, puede ir cualquier nombre o dejarlo vacío. Esto básicamente para tener un orden. Luego damos un check para que nos cree el public static, ya que me da flojera escribirlo desde cero.


Luego dentro del Main, tenemos el siguiente código, vamos a probar los 5 niveles de log4j (debug, info, warn, error, fatal) Es importante. Tener En cuenta que dentro del paréntesis de getLogger(AQUI_VA_EL_NOMBRTE_DE_LA_CLASE) En nuestro caso se llama MAIN
private static final Logger logger = LogManager.getLogger(Main.class.getName());

Bueno el código es el siguiente:

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;

public class Main {
 private static final Logger logger = LogManager.getLogger(Main.class.getName());
 
 public static void main(String[] args) {
  
        logger.debug("This is a debug message");
        logger.info("This is an info message");
        logger.warn("This is a warn message");
        logger.error("This is an error message");
        logger.fatal("This is a fatal message");
 }

}




¿y ahora? click derecho sobre la clase - > Run AS - > Java Application (Ejecutamos el proyecto)


Observamos que en la consola pinto los mensaje...


Vamos a la ruta de nuestro archivo log, y vemos que si creo el archivo =)... Heeey Heeey espera, espera, pero dice 0 Kb ¡esta vacío? ¿Que esta mal?, Bueno todo esta bien.

Vamos a explicar: En log4j versión 2 como se habrán percatado con al versión log4j versión 1 hay una diferencia muy marcada de como configurar el archivo properties, incluso en las primeras versiones 2, no soportaba .properties solo la configuración a través de un archivo XML.

Bueno al punto, para mostrar el log se puede visualizar solo de dos modos.

En consola: Esto lo usaremos cuando estemos dando un mantenimiento o estemos desarrollando el proyecto.

En archivo: Esto lo emplearemos cuando ya se encuentre el sistema en producción, es decir ya este terminado y corriendo en el servidor.

Entonces, como en el archivo de configuración que los log se visualice en consola, crea el archivo log vacío; si cambiamos al configuración para que escriba en el archivo log, ya no se visualizara en la consola. Así es, eres observador solo te mostrar en la consola o archivo, tu eliges, ¿y se puede mostrar en ambos? si lo averiguas me comentas, en la versión 2 no he podido


Ya esta bien Eric entendí, pero ¿dime ahora donde cambio si escribe en consola o archivo?

Volvemos al archivo de configuracion log4j.properties en la ultima linea cambiamos el valor a:
rootLogger.appenderRef.stdout.ref = RollingFile
y guardamos.

RollingFile: Guarda en el archivo .log
STDOUT: muestra el log en la consola

Volvemos a ejecutar la clase MAIN, click derecho Run AS -> Java Application



Vemos en la consola, no se visualiza nada.


Observamos en el archivo log, aparece con 1Kb parece que si escribió.


Abrimos Ahí esta



Listo Fiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiin.

¿Eso es todo?... Bueno con la configuración y una clase de ejemplo si, con esto ya puedes implementar en tu proyecto.

Falta explicar los niveles, y explicar las lineas, que significa log4j y luego personalizarlo... Se a hecho muy extenso la publicación, así que lo realizaremos en una segunda parte.... Hasta Pronto.



No hay comentarios:

Publicar un comentario