2010-11-29 8 views
13

que he visto el código que utiliza log4j, que adquiere logger para un determinado uso de LoggergetSimpleName() vs getName() para la adquisición de registrador

static public Logger getLogger(String name) 

y

static public Logger getLogger(Class clazz) 

con la antigua API pasó explícitamente con getSimpleName(), mientras que el último usa getName() en el Class pasado. ¿Hay alguna diferencia entre estos dos? ¿Afectaría si configuro varios paquetes para iniciar sesión en un nivel diferente en el archivo log4j.properties?

+0

Ya se mencionó en la publicación mencionada http://stackoverflow.com/q/15202997 – mhasan

Respuesta

2

Es posible que se confunda si tiene muchas clases con el mismo simpleName en diferentes paquetes. Tener muchos registradores con el mismo nombre no debería ser un problema; de lo contrario, podría ser confuso.

20

Sí, hay una gran diferencia.

Nunca uso simpleName para Logger instancia, ya que quita el nombre del paquete. Además de tener problemas cuando el mismo nombre de clase existe en dos paquetes diferentes (lo que lleva a ambas clases a obtener la misma instancia de registrador), se pierde la capacidad de controlar la herencia del registrador.

p. Ej. por dos registradores:

com.foo.A 
com.foo.B 

en propiedades, sólo puede tener:

log4j.logger.com.foo=DEBUG,CONSOLE 
4

prefiero usar el nombre completo (Class.getName()). Cuando los paquetes están organizados correctamente, esto permite ajustar log4j para manejar mensajes de registro diferentes que se originan en diferentes partes del árbol de paquetes de Java.

Por ejemplo, puede configurar fácilmente todas las clases en paquetes comenzando por "com.mycompany.infra" para usar un appender específico, y registrar solo los mensajes de nivel WARN o superior.

10

E.g. Mi clase ShapeDemo.java reside en el paquete com.test, y he escrito el código siguiente.

System.out.println("Name-->"+ShapeDemo.class.getName()); 
System.out.println("SimpleName-->"+ShapeDemo.class.getSimpleName()); 

Esta es la salida siguiente

Name-->com.test.ShapeDemo 
SimpleName-->ShapeDemo 
3

Uso de this.getClass() getName().;

Devuelve:. Alin.iwin.flickrbrowser.GetRawData

Mientras tanto

cadena privada LOG_TAG = this.getClass() getSimpleName();

Sólo devolución: GetRawData.

Cuestiones relacionadas