Frage

Ich versuche, eine benutzerdefinierte log.properties Datei zu laden, wenn meine Anwendung gestartet wird.

Meine Eigenschaften Datei ist im selben Paket wie meine Hauptklasse, so ging ich davon aus, dass die -Djava.util.logging.config.file=log.properties Befehlszeilenparameter die Eigenschaften geladene Datei erhalten sollen.

Aber die Eigenschaften werden nur dann geladen, wenn ich einen vollständigen absoluten Pfad zur Eigenschaftendatei angeben. Irgendwelche Vorschläge, wie man einen relativen Pfad benutzen?

War es hilfreich?

Lösung

Java-Protokollierung Ihre gesamte Festplatte nach einer Datei nicht suchen; es gibt sehr einfache Regeln, wie Dateien nachgeschlagen. Sie möchten Java, um zu sehen, dass die beiden Dateien zueinander gehören aber du hast nicht so überall sagen. Da Java keine Verbindung zwischen der Eigenschaften-Datei und Ihrer anderen Klasse als sieht, dass sie im selben Ordner auf der Festplatte sind, kann es die Datei nicht finden.

-Djava.util.logging.config.file=log.properties funktioniert nur, wenn die Datei log.properties im aktuellen Verzeichnis des Java-Prozesses ist (was ziemlich zufällig sein kann). So sollten Sie einen absoluten Pfad hier verwendet werden.

Eine alternative Lösung wäre, die Datei logging.properties in $JAVA_HOME/lib/ zu bewegen (oder bearbeiten Sie die Datei, die es sein sollte). In diesem Fall brauchen Sie nicht eine Systemeigenschaft zu setzen.

Andere Tipps

Sie können dynamisch java.util.logging Eigenschaften von Dateien von einem relativen Pfad sehr leicht laden. Dies ist, was ich in einem static {} Block in meiner Main Klasse setzen. Legen Sie Ihre logging.properties Datei im default package und Sie darauf zugreifen können sehr leicht mit dem folgenden Code.

final InputStream inputStream = Main.class.getResourceAsStream("/logging.properties");
try
{
    LogManager.getLogManager().readConfiguration(inputStream);
}
catch (final IOException e)
{
    Logger.getAnonymousLogger().severe("Could not load default logging.properties file");
    Logger.getAnonymousLogger().severe(e.getMessage());
}

util Protokollierung von Classpath nicht geladen, braucht es einen absoluten Pfad, weshalb andere Logging-Pakete wie log4j sind viel einfacher zu konfigurieren und besser für Web-Anwendungen, wo es ist ein Schmerz zu bekommen abs Pfade.

Das ist überhaupt in dem java.util.logging.LogManager doco nicht erklärt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top