Jak skonfigurować logowanie w Javie za pomocą pliku właściwości? (java.util.logging)


82

Mam głupi problem z logowaniem w Javie: ładuję konfigurację logowania z pliku konfiguracyjnego mojej aplikacji - ale po przeczytaniu pliku po prostu nic nie rejestruje (co wygląda prawie tak, jak przykłady, które znajdziesz w sieci, z wyjątkiem dodatkowa konfiguracja aplikacji - usunięcie tego również nie pomaga). Wiersz dziennika „inicjowanie ...” wygląda dobrze, ale „aplikacja startowa” i wszelkie dalsze komunikaty nie są rejestrowane w konsoli ani nigdy nie jest tworzony plik dziennika. Czego tu brakuje?

Kod Loggera wygląda następująco:

...
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

Properties preferences = new Properties();
try {
    FileInputStream configFile = new FileInputStream("/path/to/app.properties");
    preferences.load(configFile);
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");
...

A to jest plik konfiguracyjny:

appconfig1 = foo
appconfig2 = bar

# Logging
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

# File Logging
java.util.logging.FileHandler.pattern = %h/myApp.log
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.level = INFO

# Console Logging
java.util.logging.ConsoleHandler.level = ALL

Odpowiedzi:


28

OK, pierwsza intuicja jest tutaj:

handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler
.level = ALL

Parser plików właściwości Java nie jest wcale taki inteligentny, nie jestem pewien, czy poradzi sobie z tym. Ale znowu spojrzę na dokumenty ....

W międzyczasie spróbuj:

handlers = java.util.logging.FileHandler
java.util.logging.ConsoleHandler.level = ALL

Aktualizacja

Nie, potrzebowałem więcej kawy. Nieważne.

Chociaż myślę więcej, zauważ, że możesz użyć metod we Właściwościach, aby załadować i wydrukować plik prop: warto napisać minimalny program, aby zobaczyć, co java myśli, że czyta w tym pliku.


Kolejna aktualizacja

Ta linia:

    FileInputStream configFile = new FileInputStream("/path/to/app.properties"));

ma dodatkową końcówkę. To się nie skompiluje. Upewnij się, że pracujesz z plikiem zajęć, o którym myślisz, że jesteś.


Cóż, ma to coś wspólnego z linią readConfiguration - przeszedłem przez to za pomocą debugera i wszystkie właściwości LogManagera zostały wyczyszczone po tym wywołaniu.
VolkA

5
O tak, rozumiem - używam tego samego strumienia wejściowego dwa razy, więc muszę zmienić jego położenie za pomocą configFile.reset () - w przeciwnym razie wywołanie loadConfiguration () nie będzie miało nic do odczytania. Przy okazji. the) był po prostu błędem kopiowania z mojego działającego kodu.
VolkA

1
Nie jestem pewien, jaka jest tutaj odpowiedź?
Ondra Žižka

@ OndraŽižka, odpowiedź brzmi: „Twój kod nie działał z powodu błędu składniowego”.
Charlie Martin

102

możesz ustawić plik konfiguracyjny logowania za pomocą wiersza poleceń:

$ java -Djava.util.logging.config.file=/path/to/app.properties MainClass

w ten sposób wydaje się czystszy i łatwiejszy w utrzymaniu.


1
Tak, prawdopodobnie dodam sprawdzenie, czy ta właściwość jest ustawiona i pozwolę jej nadpisać moją konfigurację - posiadanie tego wszystkiego w jednym pliku konfiguracyjnym, który działa od razu po wyjęciu z pudełka, byłoby fajne. Dzięki!
VolkA

12

Próbowałem twojego kodu w powyższym kodzie, nie używaj instrukcji [preferencje.load (configFile);] i będzie działać. Tutaj jest uruchomiony przykładowy kod

public static void main(String[]s)
{

    Logger log = Logger.getLogger("MyClass");
    try {
    FileInputStream fis =  new FileInputStream("p.properties");
    LogManager.getLogManager().readConfiguration(fis);
    log.setLevel(Level.FINE);
    log.addHandler(new java.util.logging.ConsoleHandler());
    log.setUseParentHandlers(false);

    log.info("starting myApp");
    fis.close();

    } 
    catch(IOException e) {
    e.printStackTrace();
    }
}

1
gdzie powinny być właściwości p w stosunku do klasy głównej?
Luís Soares

9
Logger log = Logger.getLogger("myApp");
log.setLevel(Level.ALL);
log.info("initializing - trying to load configuration file ...");

//Properties preferences = new Properties();
try {
    //FileInputStream configFile = new //FileInputStream("/path/to/app.properties");
    //preferences.load(configFile);
    InputStream configFile = myApp.class.getResourceAsStream("app.properties");
    LogManager.getLogManager().readConfiguration(configFile);
} catch (IOException ex)
{
    System.out.println("WARNING: Could not open configuration file");
    System.out.println("WARNING: Logging not configured (console output only)");
}
log.info("starting myApp");

to działa ... :) musisz przekazać InputStream w readConfiguration ().


3

Czy szukasz pliku dziennika we właściwej ścieżce:% h / one% u.log

Tutaj% h oznacza Twój dom: W systemie Windows domyślnie jest to: C: \ Documents and Settings (nazwa_użytkownika).

Wypróbowałem przykładowy kod, który przesłałeś i działa dobrze po określeniu ścieżki pliku konfiguracyjnego (logowanie.properties za pomocą kodu lub argumentów Java).


Sir, czy mogę wiedzieć, gdzie jest dokumentacja online stwierdzająca, że% h rozwiązuje problem z moim domem,% u rozwiązuje coś innego itd.
Luk Aron
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.