Log en Aplicaciones Java y JavaEE

Post on 22-Jan-2018

1.120 views 1 download

Transcript of Log en Aplicaciones Java y JavaEE

Diego Armando Gomez Mosquera

logs

Introducción

• El Log es un mensaje que le indica al desarrollador la ocurrencia de un evento que desea monitorear dentro de la aplicación.

• Típicamente usamos salidas estándar en consola.

– System.out.println(“”);

– Console.WriteLine(“”);

Introducción

• Nuestras aplicaciones quedan con mensajes de todo tipo dentro del código, mensajes que en la salida a producción de los productos en algunos casos deben ser borrados.

• El código desplegado en el servidor no habla?

• En el servidor no existe forma de depurar paso a paso?

Porque no seguir usando salidas estándar a consola?

• Consume recursos en el sistema operativo ya que las llamadas a System.out.println se agregan a un archivo Log que controla el servidor de aplicaciones.

• Es difícil encontrar un error dentro de toda la aplicación.

• En tiempo de ejecución al utilizar System.out.println no es posible configurar el nivel de granularidad de los mensajes.

Porque no seguir usando salidas estándar a consola?

• No se pueden deshabilitar los mensajes, ya que están en código duro.

• El manejo y control de mensajes en tiempo de ejecución es nulo.

• No es posible enviar los mensajes a otros sistemas diferentes de la consola ejemplo JMS, JDBC, SMTP, entre otros.

Implementaciones para el manejo de mensajes de Log.

• Log4J

– http://logging.apache.org/log4j

• LOGBack

– http://logback.qos.ch/

• slf4j

– http://www.slf4j.org/

• JavaTM Logging APIs – http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/

Log4J

• Primera versión creada en 1996 por Ceki Gülcü, Michael Steiner para el proyecto SEMPER.

• En el momento existen las siguientes versiones de log4J. – 1.2

– 2.0

Log4J

• Es uno de los framework mas populares del mundo Java para el manejo de logs.

• El proyecto creció tanto que hoy en día existen implementaciones para diferentes lenguajes de programación como: C, C++, C#, Perl, Python, Ruby y Eiffel.

Log4J componentes básicos.

• Maneja tres componentes básicos.

– Nivel de prioridad de traza.

– Appenders.

– Layouts.

– Configuración.

Log4J Nivel de prioridad de traza.

• DEBUG

• INFO

• WARN

• ERROR

• FATAL

• ALL

• OFF

Nivel básico

Nivel extra

Log4J Nivel de prioridad de traza.

• DEBUG

– Se utiliza para escribir mensajes de depuración, este log no debe estar activado cuando la aplicación se encuentre en producción.

Log4J Nivel de prioridad de traza.

• INFO

– Se utiliza para mensajes similares al modo "verbose" en otras aplicaciones.

Log4J Nivel de prioridad de traza.

• WARN

– Se utiliza para mensajes de alerta sobre eventos que se desea mantener constancia, pero que no afectan el correcto funcionamiento del programa.

Log4J Nivel de prioridad de traza.

• ERROR

– Se utiliza en mensajes de error de la aplicación que se desea guardar, estos eventos afectan al programa pero lo dejan seguir funcionando, como por ejemplo que algún parámetro de configuración no es correcto y se carga el parámetro por defecto.

Log4J Nivel de prioridad de traza.

• FATAL

– Se utiliza para mensajes críticos del sistema, generalmente luego de guardar el mensaje el programa abortará.

Log4J Nivel de prioridad de traza.

• ALL

– Este es el nivel más bajo posible, habilita todos los logs de la aplicación.

Log4J Nivel de prioridad de traza.

• OFF

– Este es el nivel más alto posible, deshabilita todos los logs.

Appenders

• Los Appenders son los destinos donde pueden ser enviados los mensajes.

• Log4J cuenta con diferentes Appenders pero es posible crear los propios.

• Dependiendo de la necesidad se pueden configurar los diferentes Appenders en tiempo de ejecucion.

Appenders

• Console • File • Rolling file • GUI • TCP/IP • NT Event log • Unix Syslog daemon • JDBC • SMTP • JMS

Layouts

• Son los responsables de dar el formato a los mensajes.

• Algunos permiten formatear en diferentes formatos HTML, XML, TXT, etc.

• Uno de los mas usados es el PatternLayout el cual es muy similar al funcionamiento del printf() en C o al Formatter de JSE5.

Layouts.

• DateLayout

• HTMLLayout

• PatternLayout

• SimpleLayout

• XMLLayout

Arquitectura de log4j

Configuración

• El API de log4j es totalmente configurable y se puede hacer con el uso de un archivo de propiedades o un archivo XML.

– log4j.properties

– log4j.xml

Configuración

• log4j.properties

################################################################ ### Configuración para LOCAL ### ################################################################ #log4j.rootCategory=DEBUG, LOGFILE, CONSOLE #log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender #log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender #log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout #log4j.appender.CONSOLE.layout.ConversionPattern=%-5p %c %x - %m%n ################################################################ ### Configuración para DESARROLLO, PREPRODUCCION, PRODUCCION ### ### Sólo nos interesa el nivel de ERROR ### ### No hay salida de consola ### ################################################################ log4j.rootCategory=ERROR, diario ################################################################ ### Configuración Común ### ################################################################ log4j.appender.LOGFILE=org.apache.log4j.DailyRollingFileAppender log4j.appender.LOGFILE.file=${catalina.base}/logs/aplicacion.log log4j.appender.LOGFILE.append=true log4j.appender.LOGFILE.DatePattern='.'yyyy-MM-dd log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%-4r [%t] %-5p %c - %m%n

Configuración • log4j.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE log4j:configuration SYSTEM "dtds/org/apache/log4j/xml/log4j.dtd"> <log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false"> <appender name="console" class="org.apache.log4j.ConsoleAppender"> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%d{yyyy-MM-dd HH:mm:ss} [%c] %-5p - %m%n" /> </layout> </appender> <appender name="file" class="org.apache.log4j.FileAppender"> <!-- name is the path and name of the log file. --> <param name="File" value="debug.log"/> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="[Time: %d] [Thread: %t] [Level: %p]%m%n" /> </layout> </appender> <root> <level value="debuger"></level> <appender-ref ref="console"/> </root> </log4j:configuration>

Código con log4j

import org.apache.log4j.Logger; import org.apache.log4j.xml.DOMConfigurator; public class TestSimpleLayoutAndConsoleAppender { private static Logger logger; static{ DOMConfigurator.configure("TestSimpleLayoutAndConsoleAppender.xml"); logger = Logger.getLogger(TestSimpleLayoutAndConsoleAppender.class); } public static void main(String[] args) { logger.info("Incio el ejemplo de log4j"); logger.debug("Este es un mensaje de debug para saber que paso por aqui"); logger.error("Este es un error"); logger.fatal("Esto es fatal"); } }

Simple Logging Facade for Java (SLF4J)

• SLF4J proporciona una API de registro Java a través de un simple patrón de fachada.

• El framework de log se selecciona en tiempo de implementación y puede ser java.util.logging , log4j, logback o tinylog

Arquitectura slf4j

Código slf4j + log4j

import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TestSimpleLayoutAndConsoleAppender { private static Logger logger=LoggerFactory.getLogger(TestSimpleLayoutAndConsoleAppender.class); public static void main(String[] args) { logger.info("Incio el ejemplo de slf4j + log4j "); logger.debug("Este es un mensaje de debug para saber que paso por aqui"); logger.error("Este es un error"); logger.warn("Este es un warn"); logger.trace("Este es un trace"); } }