En esta ocasión se terminara, la personalización de log4j2.properties
Antes de empezar esta segunda parte en la publicación anterior, se explica como importar los jar necesarios y tener la configuración básica Aqui. Así que continuaremos.
Recordando... La ultima vez creamos una clase Main para utilizar los métodos de log4j2
Y configuramos el archivo log4j2.properties
Hasta ahí todo correcto, funciona.
Vamos a recordar que log4j trabaja mensajes en 5 niveles, esto es importante, para saber que mostrar y que no, son los siguientes en ese orden:
DEBUG: Este nivel ayuda a los desarrolladores a depurar la aplicación.
INFO: Da información sobre el progreso y el estado de la aplicación
WARN: Se utiliza para mensajes de alerta sobre eventos que se desea mantener constancia
ERROR: Se utiliza en mensajes de error de la aplicación que se desea guardar.
FATAL: Se utiliza para mensajes críticos del sistema.
Mas información a detalle en la wiki
Según la opción que elijamos se va mostrar, por ejemplo; si elegimos:
DEBUG, nos mostrara los 5 niveles de mensaje (DEBUG, INFO, WARN, ERROR, FATAL).
INFO, solo nos mostrara los 4 niveles de mensaje (INFO, WARN, ERROR, FATAL)
WARN, solo nos mostrara los 3 niveles de mensaje (WARN, ERROR, FATAL)
ERROR, solo nos mostrara los 2 niveles de mensaje (ERROR, FATAL)
FATAL, solo nos mostrara un nivel de mensaje (FATAL)
Para que nos sirve esto; cuando desarrollamos, queremos ver cada traza de código a detalle donde hemos pintado el mensaje, si fuese así, elegiríamos debug o info. una vez solucionado o terminado de desarrollar, el sistema debe ir a producción, es decir debe correr limpiamente el sistema, para ello no sera necesario borrar los mensajes que hemos dejado en el código, tan solo bastara que solo nos pinte los mensajes de error o fatal; los demás mensajes los ignora, esto no afecta el performance del sistema.
Si no usas log4j, ¿que harías? lo mas básico pintar los mensajes con System.out.println() y luego de terminar de depurar, tendrías que borrar todas esas lineas, lo que no tiene sentido es doble esfuerzo, y si el sistema ya en funcionamiento ocurriera un error, como verías, bueno con log4j verías el archivo; y si quisieras ver a detalle tan solo cambiarías una linea el nivel que deseas que muestre el mensaje para analizar el error.
Bueno del archivo anterior lo hemos modificado, personalizado para nuestra mejor conveniencia.
Quedando así:
status = error name = PropertiesConfig # Lista de propiedades property.log.level = DEBUG #Console: STDOUT Archivo: RollingFile property.root.logger = RollingFile property.log.dir = E:\\filelog property.log.filename = logfile.log filter.threshold.type = ThresholdFilter filter.threshold.level = debug # console appender appender.console.type = Console appender.console.name = STDOUT appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n # simple file appender appender.rolling.type = RollingFile appender.rolling.name = RollingFile appender.rolling.fileName = ${log.dir}/${log.filename} appender.rolling.filePattern = ${log.dir}/${log.filename}.%i appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n appender.rolling.policies.type = Policies appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size=100MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.max = 5 # root logger rootLogger.level = ${log.level} rootLogger.appenderRefs = root rootLogger.appenderRef.root.ref = ${root.logger}
Explicamos lo mas importante:
He tratado de solo modificar lo necesario para no confundir.
En la linea 5: Aquí vamos a elegir de que nivel deseamos que se muestre los mensajes. Ya conocemos los 5 niveles que puede ir. property.log.level es una variable, para usar esta variable en el archivo lo vemos en la linea 35 ${log.level}
En la linea 8: Vamos a decidir si el mensaje se visualiza en la consola o en el archivo, recordemos que solo se puede mostrar en uno de los dos sitios, y no en ambos, Para nuestro ejemplo: STDOUT hará referencia en la consola, ¿y como sabemos esto? porque en la linea 17 nos dice el nombre que hará referencia a la consola. Para indicar que los mensajes se escriban en el archivo en la misma linea 8 se decide cambiando el valor a: Rollingfile ¿y como sabemos eso? porque en la linea 23 le hemos dicho que ese nombre hará referencia al archivo.
Ademas observamos que en la linea 8, empleamos una variable: property.root.looger y usamos esta variable en la linea 37.
En la linea 9: Es una nueva variable que hemos creado para indicar el nombre del directorio de la carpeta donde se guardara el archivo.
En la linea 10: Creamos una nueva variable que tiene el nombre del archivo log.
En la linea 16 a la 19: Es el código para mostrar el mensaje en la consola.
En la linea 17: Es el nombre que hará referencia a la consola (Se puede cambiar)
En al linea 19: es el formato en que se muestra nuestro mensaje en la consola.
En la linea 22 a la 32: Es el código que se empleara para la escritura del archivo log.
En al linea 23: Es el nombre que hará referencia a nuestro archivo (Se puede cambiar).
En al linea 24: Indica donde se creara el archivo para ello en nuestro ejemplo usa las variables a creadas en la linea 9 y 10.
En la linea 25: Indica el comportamiento que tendrá el archivo, esto quiere decir que cada vez que se ejecute los log. los nuevos log se escribirán lineas abajo (es decir se va acumulando, no se reescribe).
En al linea 27: Muestra el formato que tendrá en al visualización de mensajes en el archivo log.
Ejecutamos nuestro clase Main, y observamos que va creando los mensajes log con el siguiente formato.
Y si cambiamos la configuración. Para que muestre en la consola, se visualizara así:
Bueno ya finalizando vamos a cambiar los nombres para que nos sea mas fácil; console: hará referencia a que el código se muestre en al consola, y file: hará referencia a que el mensaje se escriba en el archivo; recordemos la linea 7; este indica el nivel (que mensajes queremos mostrar) Aqui el código final (Observar ahorita estamos dejado en DEBUG quiere decir que pintara todos los 5 niveles, se recomienda que cuando se haya finalizado el desarrollo lo cambies a ERROR; y estamos dejando en console para que muestre el mensaje en la consola; si se desea modificar para que pinte en el archivo debe cambiarse a: file):
status = error name = PropertiesConfig # Lista de propiedades # DEBUG, INFO, WARN, ERROR, FATAL property.log.level = DEBUG # Console: console Archivo: file property.root.logger = console property.log.dir = E:\\filelog property.log.filename = logfile.log filter.threshold.type = ThresholdFilter filter.threshold.level = debug # console appender appender.console.type = Console appender.console.name = console #appender.console.target = SYSTEM_ERR appender.console.layout.type = PatternLayout appender.console.layout.pattern = %d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n # simple file appender appender.rolling.type = RollingFile appender.rolling.name = file appender.rolling.fileName = ${log.dir}/${log.filename} appender.rolling.filePattern = ${log.dir}/${log.filename}.%i appender.rolling.layout.type = PatternLayout appender.rolling.layout.pattern = %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n appender.rolling.policies.type = Policies appender.rolling.policies.size.type = SizeBasedTriggeringPolicy appender.rolling.policies.size.size=100MB appender.rolling.strategy.type = DefaultRolloverStrategy appender.rolling.strategy.max = 5 # root logger rootLogger.level = ${log.level} rootLogger.appenderRefs = root rootLogger.appenderRef.root.ref = ${root.logger}
Ejecutamos la clase MAIN, el código 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"); } }
Fin... Bueno espero esto haya ayudado un poco. Log4j2 encierra mucho mas con esta nueva versión, lean la documentación y me comentan :D
IMPORTANTE:
Si crean variables, debe tener cuidado con los espacios en blanco; de lo contrario les aparecerá error. Y dirán pero ¿porque no me saleee ? Por ejemplo. Aquí a propósito a console le doy un espacio en blanco, lo guardo y ejecuto la clase Main.
Muestra el siguiente mensaje:
2016-06-19 16:20:04,772 main ERROR Unable to locate appender "console " for logger config "root"
Listo ahora si terminamos con Log4j2, cuidado con los espacios en blanco (no debe tener nombres con espacios en blanco, es un error común).
La primera parte de log4j en la configuración Log4j 2.6.1 Parte I
No hay comentarios:
Publicar un comentario