2012-09-18 21 views
7

Tengo la siguiente clasePoner Logger.info en bloque estático

public class MyClass 
{ 
    private static final Logger logger = Logger.getLogger(MyClass.class); 

    static 
    { 
     logger.info("some text"); 
    } 
} 

¿Es seguro asumir que por el momento en que llegan logger.info, el sistema log4j se inicializa y está listo para emitir registros?

Parece que si puedo hacer un Logger.getLogger() y recuperar una instancia válida de Logger, significa que Log4j está inicializado, ¿no?

Respuesta

6

Sí, lo es. Los inicializadores estáticos (es decir, los bloques static {} y las asignaciones iniciales a las variables estáticas) se ejecutan en el orden en que se declaran.

La inicialización predeterminada de log4j se basa en un bloque estático en una clase log4j LogManager que se ejecuta una vez que se carga la clase Logger, y se carga antes de su primer uso. Es por eso que su construcción funciona.

+0

Parece que al usar SLF4j, no se garantiza que log4j también esté listo. – Timo

+0

@Timo No, no lo es, al menos no con el paquete slf4j-api solo. Necesita un paquete con una clase StaticLoggerBinder; por ejemplo slf4j-log4j12. – MaDa

+0

Y si tiene slf4j-log4j12 en classpath, ¿está garantizado entonces? – Timo

0

Consulte esta parte del JLS. Habla de lo que sucede cuando inicias una clase. This parte habla sobre inicializadores estáticos. En respuesta a su pregunta, entonces AFAIK los bloques estáticos se ejecutan en el orden en que ocurren. Se ejecutarán cuando se cargue la clase, lo que puede suceder al crear una instancia de la misma o acceder a un var/método estático de la misma.

Cuestiones relacionadas