Wie richte ich die Java-Protokollierung mithilfe einer Eigenschaftendatei ein? (java.util.logging)

82

Ich habe ein dummes Java-Protokollierungsproblem: Ich lade die Protokollierungskonfiguration aus meiner App-Konfigurationsdatei - aber sie protokolliert nach dem Lesen der Datei nichts (was den Beispielen im Internet ziemlich ähnlich ist, außer der zusätzliche Anwendungskonfiguration - das Entfernen hilft auch nicht). Die Protokollzeile "Initialisieren ..." wird einwandfrei angezeigt, aber die "Start-App" und weitere Nachrichten werden weder an der Konsole protokolliert, noch wird die Protokolldatei jemals erstellt. Was fehlt mir hier?

Der Logger-Code sieht folgendermaßen 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
VolkA
quelle

Antworten:

28

Okay, die erste Intuition ist hier:

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

Der Java Prop File Parser ist nicht so schlau, ich bin mir nicht sicher, ob er damit umgehen wird. Aber ich werde mir die Dokumente noch einmal ansehen ...

Versuchen Sie in der Zwischenzeit:

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

Aktualisieren

Nein, duh, ich brauchte mehr Kaffee. Keine Ursache.

Beachten Sie, dass Sie die Methoden in den Eigenschaften verwenden können , um eine Requisitendatei zu laden und zu drucken: Es kann sich lohnen, ein minimales Programm zu schreiben, um zu sehen, was Java in dieser Datei zu lesen glaubt.


Ein weiteres Update

Diese Linie:

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

hat einen zusätzlichen End-Paren. Es wird nicht kompiliert. Stellen Sie sicher, dass Sie mit der Klassendatei arbeiten, von der Sie glauben, dass Sie sie sind.

Charlie Martin
quelle
Nun, es hat etwas mit der readConfiguration-Zeile zu tun - ich habe dies mit einem Debugger durchlaufen und alle Eigenschaften des LogManager werden nach diesem Aufruf gelöscht.
VolkA
5
Oh ja, verstanden - ich verwende denselben Eingabestream zweimal, daher muss ich ihn mit configFile.reset () neu positionieren - andernfalls hat der Aufruf von loadConfiguration () nichts zu lesen. Übrigens. the) war nur ein Kopierfehler aus meinem Arbeitscode.
VolkA
1
Ich bin mir nicht ganz sicher, wie die Antwort hier lautet.
Ondra Žižka
@ OndraŽižka die Antwort lautet "Ihr Code hat aufgrund eines Syntaxfehlers nicht funktioniert."
Charlie Martin
98

Sie können Ihre Protokollierungskonfigurationsdatei über die Befehlszeile festlegen:

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

Dieser Weg scheint sauberer und leichter zu warten.

cd1
quelle
1
Ja, ich werde wahrscheinlich eine Überprüfung hinzufügen, ob diese Eigenschaft festgelegt ist, und meine Konfiguration überschreiben lassen - dies alles in einer Konfigurationsdatei zu haben, die sofort funktioniert, wäre jedoch nett. Vielen Dank!
VolkA
12

Ich habe versucht, Ihren Code im obigen Code zu verwenden. Verwenden Sie nicht die Anweisung [settings.load (configFile);] und es wird funktionieren. Hier wird Beispielcode ausgeführt

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();
    }
}
Rana
quelle
1
Wo sollten die Eigenschaften in Bezug auf die Hauptklasse sein?
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");

das funktioniert .. :) du musst InputStream in readConfiguration () übergeben.

Vikky Kumar
quelle
3

Suchen Sie nach der Protokolldatei im richtigen Pfad:% h / one% u.log

Hier wird% h in Ihr Zuhause aufgelöst: In Windows lautet der Standardwert: C: \ Dokumente und Einstellungen (Benutzername).

Ich habe den von Ihnen geposteten Beispielcode ausprobiert und er funktioniert einwandfrei, nachdem Sie den Pfad der Konfigurationsdatei angegeben haben (logging.properties entweder über Code oder Java-Argumente).

techzen
quelle
Sir, darf ich wissen, wo sich die Online-Dokumentation befindet, die besagt, dass% h in mein Zuhause aufgelöst wird,% u in etwas anderes aufgelöst wird usw.
Luk Aron