2009-06-06 2 views
68

Ich habe ein dummes Java-Logging-Problem: Ich lade die Logging-Konfiguration aus meiner App-Konfigurationsdatei - aber es protokolliert einfach nichts nach dem Lesen der Datei (die ähnlich wie die Beispiele aussieht Sie finden im Netz bis auf die zusätzliche Anwendungskonfiguration - das Entfernen hilft auch nicht. Die Protokollzeile "initializing ..." erscheint gut, aber die "start app" und alle weiteren Nachrichten werden weder in der Konsole protokolliert, noch wird die Logdatei jemals erstellt. Was fehlt mir hier?Wie richte ich die Java-Protokollierung mithilfe einer Eigenschaftendatei ein? (java.util.logging)

Der Logger-Code sieht wie folgt aus:

... 
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"); 
... 

Und das ist die Konfigurationsdatei:

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 

Antwort

23

Okay, erste Intuition ist hier:

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

Die Java-Prop-Datei Parser ist nicht so schlau, ich bin mir nicht sicher, ob es damit klarkommt. Aber ich werde wieder auf die Dokumentation aussehen gehen ....

In der Zwischenzeit versuchen:

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

aktualisieren

Nein, duh, benötigt mehr Kaffee. Vergiss es.

Während ich denke, mehr, beachten Sie, dass Sie die Methoden in Properties verwenden können, um eine Prop-Datei zu laden und zu drucken: Es könnte ein minimales Programm wert sein, um zu sehen, was Java denkt, dass es in dieser Datei liest.


Ein weiteres Update

Diese Zeile:

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

eine zusätzliche Ende-paren hat. Es wird nicht kompiliert. Stellen Sie sicher, dass Sie mit der Klassendatei arbeiten, die Sie für richtig halten.

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

so scheint sauberer und leichter zu pflegen:

+0

Nun, es hat etwas mit der Zeile readConfiguration zu tun - ich habe dies mit einem Debugger durchgegangen und alle Eigenschaften des LogManagers sind nach diesem Aufruf gelöscht. – VolkA

+5

Oh ja, hab es - Ich benutze den gleichen Eingabestrom zweimal, also muss ich es mit configFile.reset() neu positionieren - ansonsten hat der Aufruf von loadConfiguration() nichts zu lesen. Übrigens. Das war nur ein Kopierfehler von meinem Arbeitscode. – VolkA

80

Sie können Ihre Logging-Konfigurationsdatei über die Befehlszeile festgelegt.

+0

Ja, ich werde wahrscheinlich eine Überprüfung hinzufügen, wenn diese Eigenschaft gesetzt ist und lassen Sie es meine Konfiguration überschreiben - dies alles in einer Konfigurationsdatei, die Out-of-the-Box funktioniert wäre schön, obwohl. Vielen Dank! – VolkA

3

Sind Sie im richtigen Pfad für die Protokolldatei suchen: % h/one% u.log

Hier% h löst zu Ihnen nach Hause: Im Fenster wird standardmäßig: C: \ Dokumente und Einstellungen (Nutzername).

Ich habe versucht, den von Ihnen geposteten Beispielcode und es funktioniert gut, nachdem Sie den Pfad der Konfigurationsdatei angeben (logging.properties entweder durch Code oder Java Args).

12

Ich habe versucht, Ihren Code in oben genannten Code nicht verwenden [preferences.load (configFile);] Anweisung und es wird funktionieren.hier läuft Beispielcode

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(); 
    } 
} 
+0

Wo sollte die p.properties in Bezug auf die Hauptklasse sein? –

4
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"); 

das funktioniert .. :) Sie Input in readConfiguration geben haben().

Verwandte Themen