2012-04-27 18 views
23

Siempre he usado el siguiente patrón para construir (SLF4J) madereros:¿Cuál es la sobrecarga de crear un registrador SLF4J en contextos estáticos y no estáticos?

private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

Esto ha funcionado hasta ahora, pero me preguntaba sobre el contexto static en algún momento y la necesidad de pasar de la clase concreta literal todo el tiempo en lugar de usar un registrador no estático como

private final Logger log = LoggerFactory.getLogger(getClass()); 

Esto se ha preguntado básicamente (y respondió) antes aquí para LOG4J

Should logger be private static or not

y aquí

Should be logger always final and static?

realizo final es básicamente obligatorio, así que me quedo preguntando qué tan alto la sobrecarga de uso de SLF4J en contexto no es estática realidad.

Q:

¿Hay alguna significativa práctica sobrecarga de uso de

private final Logger log = LoggerFactory.getLogger(getClass()); 

sobre

private static final Logger log = LoggerFactory.getLogger(MyClass.class); 

en la aplicación promedio (web)? (Sin necesidad de "discutir" de gama alta, de carga pesada webapps aquí)


Nota, en última instancia, estoy planeando utilizar un enfoque aún más agradable el uso de CDI para obtener un registrador SLF4J como

@Inject private final Logger log; 

como se describe aquí http://www.seamframework.org/Weld/PortableExtensionsPackage#H-TtLoggerttInjection, pero primero necesito saber sobre el almacenamiento en caché del registrador.

Sub pregunta: ¿Es incluso posible utilizar ?:

@Inject private static final Logger log; 

(empezando con CDI para ser honesto)

+3

Tenga en cuenta que si utiliza 'getClass()' el nombre/categoría del registrador puede cambiar inesperadamente en presencia de subclases. – Thilo

+0

Gracias. De hecho, estoy buscando un "patrón de creación de registrador" aquí, pero tengo que admitir que no estoy 100% seguro de mi propio caso de uso, es decir si quiero que las posibles subclases obtengan sus propios registradores o si quiero para reutilizar el de una súper clase compartida. : -/ – Kawu

+0

puede deshacerse de esta variable si utiliza [jcabi-log] (http://www.jcabi.com/jcabi-log/), un contenedor estático alrededor de slf4j – yegor256

Respuesta

21

La sobrecarga para las variables de registrador no estáticas (instancia) debe ser insignificante a menos que ocurran muchas, digamos 10000 o más instancias. La palabra clave aquí es insignificante. Si se crean instancias de muchos objetos (> 10000), es probable que el impacto sea mensurable pero aún bajo.

Más específicamente, un registrador de instancias aumenta la huella de memoria en una referencia (64 bits) por instancia de objeto. En el lado de la CPU, el costo es una búsqueda de hash por instancia, es decir, el costo de buscar el registrador apropiado en una tabla hash (pequeña). De nuevo, ambos costos deberían ser insignificantes a menos que se creen muchos objetos.

Esta pregunta también se trata en el SLF4J FAQ.

+0

¿Qué pasa con el proceso de inyección/búsqueda involucrado? Cualquier inconveniente allí? – Kawu

+0

Ver mi respuesta actualizada. – Ceki

2

No estoy seguro acerca de la sobrecarga exacta cuando se utiliza LoggerFactory pero lo dudo afectará el rendimiento de su aplicación. Así que simplemente use estático o no estático como mejor le parezca.

Cuál debería ser el beneficio de usar @Inject. LoggerFactory ya proporciona y abstracción de la impl concreta. En cualquier caso, será mucho más lento que LoggerFactory.

La sintaxis es más concisa cuando se usa @Inject que es verdadero. Pero imagine que usa la clase en una prueba. Luego debe configurar la inyección para iniciar sesión. Con el LoggerFactory normal también funciona bien en las pruebas. Si Java tuviera un mecanismo genérico para @Inject, funcionaría muy bien, pero como es la configuración es más difícil.

+0

Es simplemente otra cosa que no tiene que le interese: si puede (básicamente) usar '@Inject logger Logger privado final;' ¿por qué debería utilizar 'private static final Logger log = LoggerFactory.getLogger (MyClass.class);' (en su mayoría no se puede notar la sobrecarga como dijo Ceki)? – Kawu

Cuestiones relacionadas