Post

Log4j bez konfiguracji

Często piszę króciutkie programy z samym mainem tylko po to, aby sprawdzić działania nieznanej funkcji API czy właśnie zaimplementowanego algorytmu. Ot taki proof-of-concept jeszcze przed napisaniem testów jednostkowych (wiem, wiem, testy piszemy najpierw, ale…)

Aby zachować pewne standardy staram się nawet w takim testowym kodzie używać Log4j do pary z commons-logging zamiast klasycznego System.out.println(). Nie tylko lepiej wygląda, ale też Log4j zapewnia pewne dodatkowe informacje. Niestety kod:

1
2
3
4
5
6
7
8
9
10
11
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

class Main {

    private static final Log log = LogFactory.getLog(Main.class);

    public static void main(String[] args) {
        log.info("Example message");
    }
}

  spowoduje wyświetlenie co najwyżej znanego skądinąd błędu:

1
2
3
log4j:WARN No appenders could be found for logger (Main).
log4j:WARN Please initialize the log4j system properly.

W takich sytuacjach z reguły kopiowałem plik log4j.xml z jakiegokolwiek innego projektu, ewentualnie delikatnie go poprawiając. Całe szczęście framework zapewnia znacznie prostszą metodę konfiguracji:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.log4j.BasicConfigurator;

class Main {

    private static final Log log = LogFactory.getLog(Main.class);

    public static void main(String[] args) {
        BasicConfigurator.configure();
        log.info("Example message");
    }
}

I wreszcie spodziewany wynik bez żadnych niepotrzebnych plików konfiguracyjnych:

1
0 [main] INFO Main  - Example message
This post is licensed under CC BY 4.0 by the author.