Вы находитесь на странице: 1из 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);

Logger barlogger = Logger.getLogger ("com.Foo.Bar");

/ / 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;

importar org.apache.log4j.Logger;
importar org.apache.log4j.PropertyConfigurator;

public class MyApp {

esttica Logger logger = Logger.getLogger (MyApp.class.getName ());

public static void main (String [] args) {


/ / 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

log4j.appender. stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout

# 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;

importar org.apache.log4j.PropertyConfigurator;
importar javax.servlet.http.HttpServlet;
javax.servlet.http.HttpServletRequest importacin;
importar javax.servlet.http.HttpServletResponse;
importar java.io.PrintWriter;
java.io.IOException importacin;

Log4jInit clase pblica se extiende HttpServlet {

pblico
void init () {
Cadena prefix = getServletContext () getRealPath ("/").;
String file = getInitParameter ("log4j-init-file");
/ / Si el archivo log4j-init no est definida, entonces no tiene
sentido tratar
if (archivo! = null) {
PropertyConfigurator.configure (prefijo + archivo);
}
}

pblico
void doGet (HttpServletRequest req, HttpServletResponse res) {
}
}
Defina lo siguiente servlet en el archivo web.xml de la aplicacin web.
<servlet>
<servlet-name> log4j-init </ servlet-name>
<servlet-class> com.foo.Log4jInit </ servlet-clase>

<init-param>
<param-name> log4j-init-file </ param-name>
<param-value> WEB-INF/classes/log4j.lcf </ param-value>
</ Init-param>

<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.

Вам также может понравиться