Descargue como DOCX, PDF, TXT o lea en línea desde Scribd
Descargar como docx, pdf o txt
Está en la página 1de 20
Breve introduccin a log4j: Ceki Gulcu, marzo de 2002
Copyright 2000-2002 La Fundacin de Software Apache. Todos los derechos reservados.
Este software se publica bajo los trminos de la Apache Software License, versin 2.0, una copia del cual se ha incluido en el archivo de licencia se incluye con la distribucin log4j. Este documento se basa en el artculo "Log4j ofrece control sobre el registro" publicado en la edicin de JavaWorld noviembre de 2000. Sin embargo, este artculo contiene informacin ms detallada y actualizada. El presente manual de corta tambin toma prestado un poco de texto de "El manual de log4j completa" del mismo autor (servidor). Abstracto En este documento se describe la API log4j, sus caractersticas nicas y razn de ser de diseo. Log4j es un proyecto de cdigo abierto basado en la obra de muchos autores. Permite al programador controlar que las declaraciones de registro se emiten con una granularidad arbitraria. Es totalmente configurable en tiempo de ejecucin utilizando archivos de configuracin externos. Lo mejor de todo, log4j tiene una curva de aprendizaje suave. Cuidado: a juzgar por comentarios de los usuarios, sino que tambin es bastante adictivo. Introduccin Casi todas las aplicaciones de gran incluye su propia API de registro o de rastreo. De conformidad con esta norma, la UE SEMPER proyecto decidi escribir su propio seguimiento de API. Esto fue a principios de 1996. Despus de innumerables mejoras, varias encarnaciones y mucho trabajo que la API ha evolucionado hasta convertirse en log4j, un paquete de registro popular para Java. El paquete se distribuye bajo la licencia de software Apache , una licencia de cdigo abierto de pleno derecho certificado por el software libre iniciativa. La ltima versin log4j, incluyendo el cdigo fuente completo, archivos de clases y la documentacin se puede encontrar en http://logging.apache.org/log4j/ . Por cierto, log4j se ha portado a la C, C + +, C #, Perl, Python, Ruby, y los idiomas Eiffel. Insercin de declaraciones de registro en cdigo es un mtodo de baja tecnologa para depurarlo. Tambin puede ser la nica manera de depuradores porque no siempre estn disponibles o aplicable. Este suele ser el caso de las aplicaciones de subprocesos mltiples y aplicaciones distribuidas en general. La experiencia indica que el registro es un componente importante del ciclo de desarrollo. Ofrece varias ventajas. Ofrece contexto preciso de una ejecucin de la aplicacin. Una vez insertado en el cdigo, la generacin de la salida de registro no requiere la intervencin humana. Por otra parte, la produccin de registro se puede guardar en un medio persistente para ser estudiado en un momento posterior. Adems de su uso en el ciclo de desarrollo, un paquete de registro suficientemente rica tambin puede ser visto como una herramienta de auditora. Como Brian W. Kernighan y Rob Pike lo puso en su realmente excelente libro "The Practice of Programming" Como opcin personal, tendemos a no utilizar los depuradores ms all de la obtencin de un Seguimiento de la pila o el valor de una variable o dos. Una de las razones es que se Es fcil perderse en los detalles de las estructuras de datos complejas y controlar el flujo, nos encontramos pasando a travs de un programa menos productivos de pensar ms y agregar instrucciones de salida y la auto-comprobacin cdigo en lugares crticos. Al hacer clic sobre las declaraciones tarda ms exploracin de la salida de las pantallas juiciosamente colocados. Se tarda menos tiempo para decidir dnde colocar sentencias print que a un solo paso para la seccin crtica de cdigo, incluso suponiendo que sepamos dnde que es. Ms importantes, declaraciones de depuracin quedan con el programa; sesiones de depuracin son transitorios. Logging tiene sus inconvenientes. Se puede ralentizar la aplicacin. Si est muy detallado, que puede causar ceguera desplazamiento. Para resolver estos problemas, log4j est diseado para ser fiable, rpido y extensible. Dado que el registro es raramente el foco principal de una aplicacin, el API log4j se esfuerza por ser fcil de entender y de usar. Leadores, appenders y Disposiciones Log4j tiene tres componentes principales: madereros, appenders y diseos. Estos tres tipos de componentes trabajan juntos para permitir a los desarrolladores para registrar los mensajes segn el tipo de mensaje y el nivel, y para controlar en tiempo de ejecucin la forma de indicar estos mensajes y en el que se informa. Logger jerarqua La primera y principal ventaja de cualquier API de registro sobre System.out.println normal reside en su capacidad para deshabilitar ciertas declaraciones de registro al tiempo que permite que otros usuarios impriman sin obstculos. Esta capacidad supone que el espacio de registro, es decir, el espacio de todos los estados posibles de tala, se clasifica de acuerdo con algunos criterios para desarrolladores elegidos. Esta observacin nos ha llevado previamente a elegir categora que el concepto central del paquete. Sin embargo, desde la versin 1.2 log4j, clase Logger ha sustituido a la clase de Categora. Para aquellos familiarizados con versiones anteriores de log4j, la clase Logger puede ser considerado como un simple alias para la clase de Categora. Los madereros se denominan entidades. Logger nombres distinguen entre maysculas y minsculas y que siguen la regla de nombres jerrquico: Jerarqua nombre Un registrador se dice que es un antepasado de otro registrador si su nombre seguido de un punto es un prefijo del nombre del registrador descendiente. Un registrador se dice que es el padre de un registrador de nio si no hay ascendientes entre ella y el registrador descendiente. Por ejemplo, el registrador de nombre "com.foo" es uno de los padres del registrador nombrado "com.Foo.Bar". Del mismo modo, "java" es uno de los padres de "java.util" y un antepasado de "java.util.Vector". Este esquema de nombres debe ser familiar para la mayora de los desarrolladores. La raz registrador reside en la parte superior de la jerarqua registrador. Es excepcional de dos maneras: 1. siempre existe, 2. no puede ser recuperada por su nombre. Invocando la clase esttica Logger.getRootLogger mtodo recupera. El resto de los madereros se crea una instancia y se recuperan con la esttica de clase Logger.getLogger mtodo. Este mtodo toma el nombre del registrador deseado como un parmetro. Algunos de los mtodos bsicos de la clase Logger se enumeran a continuacin. paquete org.apache.log4j;
Logger public class {
/ / Mtodos de creacin y recuperacin: getRootLogger Logger esttico pblico (); getLogger Logger esttico pblico (String nombre);
/ / Impresin mtodos: trace public void (mensaje de objeto); debug public void (mensaje de objeto); info public void (mensaje de objeto); public void advertencia (mensaje de objeto); public void error (mensaje de objeto); public void fatal (mensaje de objeto);
/ / Mtodo de impresin genrica: log public void (Nivel l, mensaje de objeto); } Registradores pueden ser asignados niveles. El conjunto de posibles niveles, que es:
TRACE , DEBUG , INFO , WARN , ERROR y FATAL
se definen en el org.apache.log4j.Level clase. Aunque no recomendamos que lo haga, puede definir sus propios niveles de sub-classing la clase Nivel. Un enfoque tal vez mejor se explicar ms adelante. Si un registrador dado no se le asigna un nivel, entonces se hereda una de su ancestro ms cercano con un nivel asignado. Ms formalmente: Herencia Nivel El nivel heredado para un registrador dado C, es igual a la primera nivel no nulo en la jerarqua de registrador, a partir de C y procediendo hacia arriba en la jerarqua hacia el registrador de la raz. Para asegurarse de que todos los registradores con el tiempo pueden heredar un nivel, el registrador de la raz siempre tiene un nivel asignado. A continuacin se presentan cuatro tablas con diversos valores del nivel asignado y los niveles heredados resultante de acuerdo con la regla anterior. Ejemplo 1 Logger nombre Asignado nivel Heredado nivel raz Proot Proot X ninguno Proot XY ninguno Proot XYZ ninguno Proot En el ejemplo 1 anterior, slo la raz registrador se le asigna un nivel. Este valor de nivel, Proot, es heredada por los otros registradores X, XY y XYZ. Ejemplo 2 Logger nombre Asignado nivel Heredado nivel raz Proot Proot X Px Px XY Pxy Pxy XYZ PXYZ PXYZ En el ejemplo 2, todos los madereros tienen un valor de nivel asignado. No hay necesidad de sucesiones nivel. Ejemplo 3 Logger nombre Asignado nivel Heredado nivel raz Proot Proot X Px Px XY ninguno Px XYZ PXYZ PXYZ En el ejemplo 3, registradores de la raz, X y XYZ se asignan los niveles de Proot, Px y PXYZ respectivamente. El registrador XY hereda el valor del nivel de su matriz X. Logger nombre Asignado nivel Heredado nivel raz Proot Proot X Px Px XY ninguno Px XYZ ninguno Px Ejemplo 4 En el ejemplo 4, la raz madereros y X y se asignan los niveles de Proot y Px respectivamente. Los registradores XY y XYZ hereda el valor del nivel de su ms cercano matriz X que tiene un nivel asignado .. Solicitudes de registro se hacen mediante la invocacin de uno de los mtodos de impresin de una instancia de registrador. Estos mtodos de impresin son debug , info , warn , error , fatal y registro . Por definicin, el mtodo de impresin determina el nivel de una solicitud de registro. Por ejemplo, si c es un registrador de ejemplo, a continuacin la declaracin c.info ("..") es una solicitud de registro de nivel INFO. La solicitud de registro se dice que est habilitado si su nivel es mayor que o igual al nivel de su registrador. De lo contrario, se dice que la solicitud est deshabilitado. Un registrador sin un nivel asignado heredar uno de la jerarqua. Esta regla se resume a continuacin. Regla de seleccin bsico La solicitud de registro de nivel de p en un logger (ya sea asignado o heredado, segn sea el caso) Nivel de q, se habilita si p> = q. Esta regla se encuentra en el corazn de log4j. Se asume que los niveles se ordenan. Para los niveles estndar, tenemos DEBUG <INFO <WARN <ERROR <FATAL. He aqu un ejemplo de esta regla.
/ / Obtener una instancia de registrador nombrado "com.foo" Logger logger = Logger.getLogger ("com.foo");
/ / Ahora ponga su nivel. Normalmente no es necesario para establecer el / / Nivel de un registrador de programacin. Esto se hace generalmente / / En archivos de configuracin. . logger setLevel (Level.INFO);
/ / Esta peticin est habilitada, porque WARN> = INFO. logger advertir ("Bajo nivel de combustible.").;
/ / Esta peticin est desactivada, porque DEBUG <INFO. logger debug ("Inicio bsqueda de gasolinera.").;
/ / El barlogger ejemplo logger, llamada com.Foo.Bar", / / Heredar su nivel del registrador nombrado / / "Com.foo" Por lo tanto, la siguiente solicitud est activado / / Porque INFO> = INFO. . barlogger info ("Situado cercana estacin de gas.");
/ / Esta peticin est desactivada, porque DEBUG <INFO. barlogger debug ("Salir de la estacin de servicio de bsqueda").; Al llamar al mtodo getLogger con el mismo nombre siempre devolver una referencia al mismo objeto exacto logger. Por ejemplo, en Logger x = Logger.getLogger ("wombat"); Logger y = Logger.getLogger ("wombat"); x e y se refieren a exactamente el mismo objeto registrador. Por lo tanto, es posible configurar un registrador y luego para recuperar la misma instancia de algn otro sitio en el cdigo sin pasar alrededor de referencias. En contradiccin fundamental a la paternidad biolgica, donde los padres siempre preceder a sus hijos, los madereros log4j se pueden crear y configurar en cualquier orden. En particular, un "padre" registrador conocer y llegar a sus descendientes, incluso si se crea una instancia de ellos. Configuracin del entorno de log4j se realiza tpicamente en la inicializacin de la aplicacin. La forma preferida es mediante la lectura de un archivo de configuracin. Este enfoque se discutir en breve. Log4j hace que sea fcil para nombrar registradores de componentes de software. Esto se puede lograr por estticamente instancias de un registrador en cada clase, con el nombre del registrador igual al nombre completo de la clase. Este es un mtodo til y sencilla de definir madereros. Como el resultado del registro lleva el nombre del registrador de la generacin, esta estrategia de nombres hace que sea fcil de identificar el origen de un mensaje de registro. Sin embargo, sta es slo una posible, aunque comn, la estrategia para nombrar registradores. Log4j no restringe el posible conjunto de los madereros. El desarrollador es libre de nombrar a los registradores lo deseas. Sin embargo, nombrando madereros despus de la clase en la que se encuentran parece ser la mejor estrategia conocida hasta ahora. Appenders y Disposiciones La posibilidad de activar o desactivar las solicitudes de registro de la base de su registrador selectiva es slo una parte de la imagen. Log4j permite que las solicitudes de registro de usuarios impriman con mltiples destinos. En Speak log4j, un destino de salida se denomina appender. En la actualidad, existen appenders para la consola , archivos , componentes GUI, socket remoto servidores, JMS , registradores de eventos de NT y UNIX remoto Syslog demonios. Tambin es posible registrar de forma asncrona . Ms de un appender puede estar unido a un registrador. El addAppender mtodo agrega un appender a un registrador determinado. Cada solicitud de registro activado por un registrador determinado ser enviada a todos los appenders en que el maderero, as como los appenders superior en la jerarqua. En otras palabras, appenders se heredan de forma aditiva del registrador jerarqua. Por ejemplo, si un appender consola se agrega al registro raz, todas las solicitudes de registro habilitado tendr al menos impresin en la consola. Si adems se aade un adicionador de archivo a un registrador, por ejemplo C, a continuacin, habilitado el registro solicitudes de C y los nios C 's va a imprimir en un archivo y en la consola. Es posible anular este comportamiento predeterminado para que la acumulacin appender ya no es aditiva por establecer el indicador de adicin en false. Las normas que rigen la aditividad appender se resumen a continuacin. Aditividad appender La salida de una declaracin de registro del registrador C ir a todos los appenders en C y sus antepasados. Este es el significado del trmino "aditividad appender". Sin embargo, si un antepasado del registrador de C, por ejemplo P, tiene la bandera de adicin se establece en false, la salida C 's se dirige a todos los appenders en C y sus antepasados upto e incluyendo P pero no las appenders en cualquiera de los antepasados de P. Los madereros tienen su bandera aditividad establecido en true de forma predeterminada. La tabla a continuacin muestra un ejemplo: Logger Nombre Adicional Appenders Aditividad Bandera Metas de produccin Comentario raz A1 no aplicable A1 La raz logger es annimo, pero se puede acceder con el mtodo Logger.getRootLogger (). No hay appender predeterminado unida a la raz. x A-x1, x2 A- verdadero A1, A-x1, x2 A- Appenders de "x" y la raz. xy ninguno verdadero A1, A-x1, x2 A- Appenders de "x" y la raz. xyz A-XYZ1 verdadero A1, A-x1, x2 A-, A- XYZ1 Appenders en "xyz", "x" y la raz. seguridad A-sec falso A-sec Ninguna acumulacin appender ya la bandera de adicin se establece en false. security.access ninguno verdadero A-sec Slo appenders de "seguridad", porque la bandera de adicin de "seguridad" se establece en false. Ms a menudo que no, los usuarios desean personalizar no slo el destino de salida, sino tambin el formato de salida. Esto se logra mediante la asociacin de un diseo con un appender. El diseo es responsable de formatear la solicitud de registro de acuerdo a los deseos del usuario, mientras que un appender se encarga de enviar la salida con formato a su destino. El PatternLayout , parte de la distribucin estndar de log4j, permite al usuario especificar el formato de salida de acuerdo a los patrones de conversin similar a la funcin printf lenguaje C. Por ejemplo, el PatternLayout con el patrn de conversin "% r [% t]%-5p% c -% m% n" seria algo similar a: 176 [principal] INFO org.foo.Bar - Situado cercana estacin de gas. El primer campo es el nmero de milisegundos transcurridos desde el comienzo del programa. El segundo campo es el hilo que hace la solicitud de registro. El tercer campo es el nivel de la declaracin de registro. El cuarto campo es el nombre del registrador asociado a la solicitud de registro. El texto que sigue a la "-" es el mensaje de la declaracin. Igual de importante, log4j har que el contenido del mensaje de registro de acuerdo con los criterios especificados por el usuario. Por ejemplo, si con frecuencia que entrar naranjas, un tipo de objeto utilizado en el proyecto actual, entonces usted puede registrar una OrangeRenderer que se invoca cada vez que una naranja tiene que estar conectado. Prestacin objeto sigue la jerarqua de clases. Por ejemplo, suponiendo que las naranjas son las frutas, si se registra un FruitRenderer, todas las frutas como naranjas sern prestados por la FruitRenderer, a menos que, por supuesto, se registr un OrangeRenderer especfica naranja. Renderers objetos tienen que poner en prctica el ObjectRenderer interfaz. Configuracin Insercin de solicitudes de registro en el cdigo de la aplicacin requiere una buena cantidad de planificacin y esfuerzo. La observacin muestra que aproximadamente el 4 por ciento del cdigo est dedicada a la explotacin forestal. En consecuencia, incluso las aplicaciones de tamao moderado tendrn miles de tala instrucciones incrustadas dentro de su cdigo. Teniendo en cuenta su nmero, se hace imprescindible para gestionar estas declaraciones de registro y sin la necesidad de modificar manualmente. El entorno de log4j es totalmente configurable mediante programacin. Sin embargo, es mucho ms flexible para configurar log4j usando archivos de configuracin. Actualmente, los archivos de configuracin pueden ser escritos en XML o en formato Java propiedades (clave = valor). Vamos a dar una idea de cmo se hace esto con la ayuda de una aplicacin imaginaria MyApp que utiliza log4j. importar com.Foo.Bar;
/ / Importar las clases de log4j. importar org.apache.log4j.Logger; importar org.apache.log4j.BasicConfigurator;
public class MyApp {
/ / Se define una variable esttica logger para que haga referencia al / Ejemplo / Logger llamado "MyApp". esttica Logger logger = Logger.getLogger (MyApp.class);
public static void main (String [] args) {
/ / Configurar una configuracin sencilla que inicia sesin en la consola. BasicConfigurator.configure ();
logger.info ("Introduccin de aplicacin."); Bar bar = nueva barra (); bar.doIt (); logger.info ("Salir de la aplicacin."); } } MyApp empieza importando las clases relacionadas log4j. A continuacin, se define una variable registrador esttico con el nombre MyApp que pasa a ser el nombre completo de la clase. MyApp utiliza la clase definida en el Bar com.foo paquete. paquete com.foo; importar org.apache.log4j.Logger;
Bar clase pblica { esttica Logger logger = Logger.getLogger (Bar.class);
doIt public void () { logger.debug ("Did It Again"); } } La invocacin del BasicConfigurator.configure mtodo crea una configuracin de log4j bastante simple. Este mtodo est cableado para aadir al registrador raz de una ConsoleAppender . La salida se dar formato utilizando un PatternLayout establecido en el patrn "%-4r [% t]%-5p% c% x -% m% n". Tenga en cuenta que, por defecto, la raz logger se asigna a Level.DEBUG. La salida de MiApl es: 0 [principal] INFO MyApp - Introduccin de aplicacin. 36 com.Foo.Bar [principal] DEBUG - Lo hizo otra vez! 51 [principal] INFO MyApp - Aplicacin de salir. La siguiente figura muestra el diagrama de objetos de MyApp justo despus de haber llamado al mtodo BasicConfigurator.configure.
Como nota al margen, permtanme mencionar que los madereros nio log4j vincular slo a sus antepasados ya existentes. En particular, el registrador nombrado com.Foo.Bar est vinculado directamente al registrador de la raz, evitando as la com no utilizado o madereros com.foo. Esto aumenta significativamente el rendimiento y reduce el consumo de memoria de log4j. Las configura clase MyApp log4j invocando mtodo BasicConfigurator.configure. Otras clases slo tienen que importar la clase org.apache.log4j.Logger, recuperar los madereros que desea utilizar y registrar de inmediato. El ejemplo anterior siempre imprime la misma informacin de registro. Afortunadamente, es fcil de modificar MyApp para que la salida del registro puede ser controlado en tiempo de ejecucin. Aqu es una versin ligeramente modificada. importar com.Foo.Bar;
/ / BasicConfigurator sustituye con PropertyConfigurator. PropertyConfigurator.configure (args [0]);
logger.info ("Introduccin de aplicacin."); Bar bar = nueva barra (); bar.doIt (); logger.info ("Salir de la aplicacin."); } } Esta versin de MyApp instruye PropertyConfigurator para analizar un archivo de configuracin y configurar el registro correspondiente. Este es un archivo de configuracin de ejemplo que se traduce en la produccin idntica a la del ejemplo basado BasicConfigurator anterior. # Establezca el nivel de registrador de la raz a depurar y su nico appender a A1. log4j.rootLogger = DEBUG, A1
# A1 se ajusta para que sea un ConsoleAppender. log4j.appender.A1 = org.apache.log4j.ConsoleAppender
# A1 utiliza PatternLayout. log4j.appender.A1.layout = org.apache.log4j.PatternLayout log4j.appender.A1.layout.ConversionPattern =%-4r [% t]%-5p% c% x -% m% n Supongamos que ya no estamos interesados en ver la salida de cualquiera de los componentes que pertenecen al paquete com.foo. El archivo de configuracin siguiente muestra una posible manera de lograr esto. log4j.rootLogger = DEBUG, A1 log4j.appender.A1 = org.apache.log4j.ConsoleAppender log4j.appender.A1.layout = org.apache.log4j.PatternLayout
# Escriba la fecha en formato ISO 8601 log4j.appender.A1.layout.ConversionPattern =% d [% t]%-5p% c -% m% n
# Imprime slo mensajes de nivel de WARN o superior en la com.foo paquete. log4j.logger.com.foo = WARN La salida de MyApp configurado con este archivo se muestra a continuacin. 2000-09-07 14:07:41,508 [principal] INFO MyApp - Introduccin de aplicacin. 2000-09-07 14:07:41,529 [principal] INFO MyApp - Salir de la aplicacin. A medida que el com.Foo.Bar logger no tiene un nivel asignado, que hereda su nivel de com.foo, que se establece en WARN en el archivo de configuracin. La declaracin de registro del mtodo Bar.doIt DEBUG tiene el nivel, ms bajo que el nivel de registrador WARN. En consecuencia, se suprime la solicitud de registro doIt () del mtodo. Aqu hay otro archivo de configuracin que utiliza mltiples appenders. log4j.rootLogger = debug, stdout, R
# Modelo para la salida de nombre de archivo de la persona que llama y el nmero de lnea. log4j.appender.stdout.layout.ConversionPattern =% 5p [% t] (% F:% L) -% m% n
log4j.appender. R = org.apache.log4j.RollingFileAppender log4j.appender.R.File = example.log
log4j.appender.R.MaxFileSize = 100 KB # Mantener un archivo de copia de seguridad log4j.appender.R.MaxBackupIndex = 1
log4j.appender.R.layout = org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern =% p% t% c -% m% n Llamar a la mayor MyApp con el archivo de esta configuracin es la salida del siguiente en la consola. INFO [principal] (MyApp2.java: 12) - Registro de aplicacin. DEBUG [principal] (Bar.java: 8) - Haciendo de nuevo! INFO [principal] (MyApp2.java: 15) - Solicitud de salir. Adems, como la raz registrador se ha asignado una segunda appender, salida tambin se dirige al archivo example.log. Este archivo se dio la vuelta cuando llega a 100KB. Cuando se produce el vuelco, la versin antigua de example.log se mueve automticamente a example.log.1. Tenga en cuenta que para obtener estos diferentes comportamientos de registro que no necesitbamos para volver a compilar el cdigo. Podramos fcilmente haber conectado a un demonio de syslog UNIX, reorientado toda la salida com.foo a un registrador de eventos NT o reenvo de eventos de registro a un servidor remoto log4j, lo que ingrese de acuerdo con la poltica del servidor local, por ejemplo mediante el envo del registro evento a un segundo servidor de log4j. Procedimiento de inicializacin por defecto La biblioteca log4j no hace ninguna suposicin sobre su entorno. En particular, no hay defecto appenders log4j. En determinadas circunstancias bien definidas sin embargo, el inializer esttico de la clase Logger intentar configurar automticamente log4j. El lenguaje Java garantiza que el inicializador esttico de una clase se llama una vez y slo una vez durante la carga de una clase en la memoria. Es importante recordar que diferentes cargadores de clases pueden cargar copias diferentes de la misma clase. Estas copias de la misma clase son consideradas como totalmente ajenos por la JVM. La inicializacin por defecto es muy til en entornos en los que el punto de entrada a la aplicacin exacta depende del entorno de ejecucin. Por ejemplo, la misma aplicacin se puede utilizar como una aplicacin independiente, como un applet, o como un servlet bajo el control de un servidor web. El algoritmo exacto inicializacin predeterminada se define como sigue: 1. Al establecer la propiedad del sistema log4j.defaultInitOverride a cualquier otro valor, entonces "false" har que log4j para omitir el procedimiento de inicializacin por defecto (este procedimiento). 2. Configurar la cadena de recurso variable para el valor de la propiedad del sistema log4j.configuration. La mejor forma de especificar el archivo de inicializacin por defecto es a travs de la propiedad del sistema log4j.configuration. En caso de que el log4j.configuration propiedad del sistema no est definido, a continuacin, establecer la cadena recurso variable a su valor predeterminado "log4j.properties". 3. Intente convertir la variable de recursos a una URL. 4. Si la variable de recurso no puede ser convertido a una direccin URL, por ejemplo, debido a un MalformedURLException, a continuacin, la bsqueda para el recurso de la ruta de clase llamando org.apache.log4j.helpers.Loader.getResource (recursos, Logger.class) que devuelve una URL . Tenga en cuenta que la cadena "log4j.properties" constituye una URL malformada. Ver Loader.getResource (java.lang.String) de la lista de ubicaciones de bsqueda. 5. Si no se pudo encontrar ninguna URL, inicializacin predeterminada abortar. De lo contrario, configurar log4j de la URL. El PropertyConfigurator se utilizar para analizar la URL para configurar log4j a menos que la URL termina con la extensin ". xml", en cuyo caso el DOMConfigurator se utilizar. Usted puede opcionalmente especificar un configurador personalizado. El valor de la propiedad del sistema log4j.configuratorClass se toma como el nombre de clase completo del configurador personalizado. El configurador personalizado que especifique debe implementar el Configurador de interfaz. Configuraciones de ejemplo Inicializacin predeterminado bajo Tomcat La inicializacin log4j predeterminado es particularmente til en entornos de servidores web. En Tomcat 3.xy 4.x, debe colocar los log4j.properties en el directorio WEB- INF/classes de sus aplicaciones web. Log4j se encuentra el archivo de propiedades y inicializarse. Esto es fcil de hacer y funciona. Tambin puede optar por configurar el log4j.configuration propiedad del sistema antes de iniciar Tomcat. Para Tomcat 3.x La variable de entorno TOMCAT_OPTS se utiliza para definir las opciones de lnea de comandos. Para Tomcat 4.0, establezca la variable de entorno CATALINA_OPTS lugar de TOMCAT_OPTS. Ejemplo 1 El comando Unix shell exportacin TOMCAT_OPTS = "-Dlog4j.configuration = foobar.txt" dice log4j utilizar el archivo foobar.txt que el archivo de configuracin por defecto. Este archivo debe ser el lugar en el directorio WEB-INF/classes de la aplicacin web. El archivo se puede leer mediante el PropertyConfigurator . -Cada aplicacin web utiliza un archivo de configuracin predeterminada diferente ya que cada archivo es relativa a una aplicacin web. Ejemplo 2 El comando Unix shell exportacin TOMCAT_OPTS = "-Dlog4j.debug-Dlog4j.configuration = foobar.xml" dice log4j para la salida de informacin de depuracin log4j-interna y utilizar el archivo foobar.xml que el archivo de configuracin por defecto. Este archivo debe ser el lugar en el directorio WEB-INF/classes de la aplicacin web. Dado que el archivo termina con la extensin xml., Leer con el DOMConfigurator . -Cada aplicacin web utiliza un archivo de configuracin predeterminada diferente ya que cada archivo es relativa a una aplicacin web. Ejemplo 3 El comando de shell de Windows establecer TOMCAT_OPTS =-Dlog4j.configuration = foobar.lcf- Dlog4j.configuratorClass = com.foo.BarConfigurator dice log4j utilizar el archivo foobar.lcf que el archivo de configuracin por defecto. Este archivo debe ser el lugar en el directorio WEB-INF/classes de la aplicacin web. Debido a la definicin de la propiedad del sistema log4j.configuratorClass, el archivo se puede leer con la costumbre com.foo.BarConfigurator configurador. -Cada aplicacin web utiliza un archivo de configuracin predeterminada diferente ya que cada archivo es relativa a una aplicacin web. Ejemplo 4 El comando de shell de Windows establecidos TOMCAT_OPTS =-Dlog4j.configuration = file :/ c :/ foobar.lcf dice log4j utilizar el archivo c: \ foobar.lcf que el archivo de configuracin por defecto. El archivo de configuracin est totalmente especificado por el archivo URL :/ c :/ foobar.lcf. Por lo tanto, el mismo archivo de configuracin se utiliza para todas las aplicaciones web. Diferentes aplicaciones web se cargarn las clases log4j a travs de sus respectivos classloaderss. Por lo tanto, cada imagen del medio ambiente log4j actuar independetly y sin ninguna sincronizacin mutua. Por ejemplo, FileAppenders definen de la misma manera en mltiples configuraciones de aplicaciones web todos se intentar escribir el mismo archivo. Los resultados son propensos a ser menos que satisfactorio. Usted debe asegurarse de que las configuraciones de log4j de diferentes aplicaciones web no usan el mismo recurso del sistema subyacente. Servlet de inicializacin Tambin es posible utilizar un servlet especial para la inicializacin de log4j. He aqu un ejemplo, paquete com.foo;
<load-on-startup> 1 </ load-on-startup> </ Servlet> Escribir un servlet de inicializacin es la forma ms flexible para inicializar log4j. No hay restricciones sobre el cdigo que puede colocar en el mtodo init () del servlet. Contextos de diagnstico anidadas La mayora de los sistemas del mundo real tienen que hacer frente a varios clientes al mismo tiempo. En una aplicacin multiproceso tpica de tal sistema, diferentes hilos se encargar de los diferentes clientes. El registro est especialmente bien adaptado para rastrear y depurar aplicaciones distribuidas complejas. Un enfoque comn para diferenciar la salida del registro de un cliente de otro es crear una instancia de un nuevo registrador independiente para cada cliente. Esto promueve la proliferacin de registradores y aumenta la carga de administracin de la explotacin forestal. Una tcnica es ms ligero para acabar inequvoca cada solicitud de registro inicia a partir de la misma interaccin con el cliente. Neil Harrison describe este mtodo en el libro "Patrones de registro Mensajes de diagnstico", en Lenguajes de Patrones de Diseo del Programa 3, editado por R. Martin, D. Riehle y F. Buschmann (Addison-Wesley, 1997). Para acabar de forma nica cada solicitud, el usuario pulsa la informacin contextual en el NDC, la abreviatura de diagnstico Nested Context. La clase NDC se muestra a continuacin. public class NDC { / / Se utiliza al imprimir el diagnstico public static String get ();
/ / Quitar la parte superior del marco de la NDC. pop static String pblica ();
/ / Aadir el contexto de diagnstico para el subproceso actual. public static void push (String mensaje);
/ / Eliminar el contexto de diagnstico para este hilo. public static void remove (); } El NDC es administrado por hilo como una pila de informacin contextual. Tenga en cuenta que todos los mtodos de la clase org.apache.log4j.NDC son estticos. Suponiendo que la impresin NDC est activada, cada vez que una solicitud de registro se hace, el componente log4j adecuada incluir toda la pila de NDC para el subproceso actual en la salida del registro. Esto se hace sin la intervencin del usuario, que slo es responsable de la colocacin de la informacin correcta en el NDC mediante el uso de los mtodos de insercin y el pop en algunos puntos bien definidos en el cdigo. En contraste, el enfoque registrador por cliente manda extensos cambios en el cdigo. Para ilustrar este punto, tomemos el ejemplo de un contenido de la entrega de servlet para numerosos clientes. El servlet puede construir el NDC en el comienzo mismo de la solicitud antes de ejecutar otro cdigo. La informacin de contexto puede ser el nombre de host del cliente y otra informacin inherente a la solicitud, por lo general la informacin contenida en las cookies. Por lo tanto, incluso si el servlet est sirviendo a mltiples clientes a la vez, los registros iniciados por el mismo cdigo, es decir, que pertenece al mismo registrador, todava se pueden distinguir porque cada solicitud de cliente tendr una pila NDC diferente. Esto contrasta con la complejidad de pasar un registrador recin instanciado a todo el cdigo ejercido durante la solicitud del cliente. Sin embargo, algunas aplicaciones sofisticadas, como los servidores de alojamiento web virtual, debe iniciar de manera diferente dependiendo del contexto de host virtual y tambin en funcin del componente de software solicitante. Comunicados de log4j recientes apoyan mltiples rboles jerrquicos. Esta mejora permite que cada host virtual de poseer su propia copia de la jerarqua logger. Rendimiento Uno de los argumentos citados con frecuencia en contra de la tala es su coste computacional. Esta es una preocupacin legtima, ya que incluso las aplicaciones de tamao moderado puede generar miles de solicitudes de registro. Mucho esfuerzo se gast medicin y registro de rendimiento afinando. Reclamaciones Log4j para ser rpida y flexible: la velocidad primero, segundo flexibilidad. El usuario debe tener en cuenta los siguientes problemas de rendimiento. 1. Registro de rendimiento cuando el registro est desactivado. Cuando el registro est desactivado por completo o slo para un conjunto de niveles , el costo de una solicitud de registro se compone de una invocacin de mtodo ms una comparacin de enteros. On a 233 MHz Pentium II machine this cost is typically in the 5 to 50 nanosecond range. However, The method invocation involves the "hidden" cost of parameter construction. For example, for some logger cat , writing, logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i]));
incurs the cost of constructing the message parameter, ie converting both integer i and entry[i] to a String, and concatenating intermediate strings, regardless of whether the message will be logged or not. This cost of parameter construction can be quite high and it depends on the size of the parameters involved. To avoid the parameter construction cost write: if(logger.isDebugEnabled() { logger.debug("Entry number: " + i + " is " + String.valueOf(entry[i])); }
This will not incur the cost of parameter construction if debugging is disabled. On the other hand, if the logger is debug-enabled, it will incur twice the cost of evaluating whether the logger is enabled or not: once in debugEnabled and once in debug . This is an insignificant overhead because evaluating a logger takes about 1% of the time it takes to actually log. In log4j, logging requests are made to instances of the Logger class. Logger is a class and not an interface. This measurably reduces the cost of method invocation at the cost of some flexibility. Certain users resort to preprocessing or compile-time techniques to compile out all log statements. This leads to perfect performance efficiency with respect to logging. However, since the resulting application binary does not contain any log statements, logging cannot be turned on for that binary. In my opinion this is a disproportionate price to pay in exchange for a small performance gain. 2. The performance of deciding whether to log or not to log when logging is turned on. This is essentially the performance of walking the logger hierarchy. When logging is turned on, log4j still needs to compare the level of the log request with the level of the request logger. However, loggers may not have an assigned level; they can inherit them from the logger hierarchy. Thus, before inheriting a level, the logger may need to search its ancestors. There has been a serious effort to make this hierarchy walk to be as fast as possible. For example, child loggers link only to their existing ancestors. In the BasicConfigurator example shown earlier, the logger named com.foo.Bar is linked directly to the root logger, thereby circumventing the nonexistent com or com.foo loggers. This significantly improves the speed of the walk, especially in "sparse" hierarchies. The typical cost of walking the hierarchy is typically 3 times slower than when logging is turned off entirely. 3. Actually outputting log messages This is the cost of formatting the log output and sending it to its target destination. Here again, a serious effort was made to make layouts (formatters) perform as quickly as possible. The same is true for appenders. The typical cost of actually logging is about 100 to 300 microseconds. See org.apache.log4.performance.Logging for actual figures. Although log4j has many features, its first design goal was speed. Some log4j components have been rewritten many times to improve performance. Nevertheless, contributors frequently come up with new optimizations. You should be pleased to know that when configured with the SimpleLayout performance tests have shown log4j to log as quickly as System.out.println . Conclusiones Log4j is a popular logging package written in Java. One of its distinctive features is the notion of inheritance in loggers. Using a logger hierarchy it is possible to control which log statements are output at arbitrary granularity. This helps reduce the volume of logged output and minimize the cost of logging. One of the advantages of the log4j API is its manageability. Once the log statements have been inserted into the code, they can be controlled with configuration files. They can be selectively enabled or disabled, and sent to different and multiple output targets in user- chosen formats. The log4j package is designed so that log statements can remain in shipped code without incurring a heavy performance cost. Agradecimientos Many thanks to N. Asokan for reviewing the article. He is also one of the originators of the logger concept. I am indebted to Nelson Minar for encouraging me to write this article. He has also made many useful suggestions and corrections to this article. Log4j is the result of a collective effort. My special thanks go to all the authors who have contributed to the project. Without exception, the best features in the package have all originated in the user community. Copyright 1999-2012 Apache Software Foundation . Licensed under the Apache Software License, Version 2.0 . Apache Extras Companion for Apache log4j, Apache log4j, Apache, the Apache feather logo, the Apache Logging Services project logo, the log4j logo, and the Built by Maven logo are trademarks of The Apache Software Foundation. Oracle y Java son marcas registradas de Oracle y / o sus filiales. Otros nombres pueden ser marcas comerciales de sus respectivos propietarios.