2012-09-18 15 views
7

Mam następujące klasyUmieszczenie Logger.info w bloku statycznego

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

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

Czy można bezpiecznie założyć, że zanim dotrzemy logger.info system log4j jest zainicjowana i jest gotowy do wysyłania logów?

Wygląda na to, że jeśli jestem w stanie wykonać Logger.getLogger() i odzyskać poprawną instancję programu Logger, oznacza to, że Log4j jest zainicjowany, prawda?

Odpowiedz

6

Tak, jest. Statyczne inicjalizatory (to jest oba bloki static {} i początkowe przypisania do zmiennych statycznych) są wykonywane w kolejności, w jakiej są zadeklarowane.

Domyślna inicjalizacja log4j opiera się na bloku statycznym w klasie log4j LogManager, który jest wykonywany po załadowaniu klasy Logger i jest ładowany przed pierwszym użyciem. Dlatego twoja konstrukcja działa.

+0

Wygląda na to, że przy korzystaniu z SLF4j nie ma gwarancji, że log4j jest również gotowy. – Timo

+0

@Timo Nie, nie jest, przynajmniej nie z samym pakietem slf4j-api. Potrzebujesz pakietu z klasą StaticLoggerBinder; na przykład slf4j-log4j12. – MaDa

+0

A jeśli masz slf4j-log4j12 na ścieżce klas, czy jest to zagwarantowane? – Timo

0

Zobacz tę część JLS. Mówi o tym, co dzieje się podczas inicjowania zajęć. This część mówi o statycznych inicjalizatorach. W odpowiedzi na twoje pytanie AFAIK statyczne bloki są wykonywane w kolejności, w jakiej występują. Będą one wykonywane, gdy klasa zostanie załadowana, co może się zdarzyć, gdy utworzysz jej instancję lub uzyskasz statyczną odmianę/metodę.

Powiązane problemy