2009-04-30 8 views
23

Ich versuche, eine benutzerdefinierte log.properties Datei zu laden, wenn meine Anwendung gestartet wird.Laden Sie java.util.logging.config.file für die Standardinitialisierung

Meine Eigenschaftendatei befindet sich im selben Paket wie meine Hauptklasse. Daher nahm ich an, dass der Befehlszeilenparameter -Djava.util.logging.config.file=log.properties die Eigenschaftendatei laden sollte.

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

Antwort

18

Java-Protokollierung durchsucht nicht Ihre gesamte Festplatte nach einer Datei; Es gibt sehr einfache Regeln, wie Dateien gesucht werden. Sie möchten, dass Java erkennt, dass die beiden Dateien zueinander gehören, aber Sie haben es nirgends gesagt. Da Java zwischen der Eigenschaftendatei und Ihrer Klasse keine andere Verbindung als die, in der sie sich im selben Ordner auf Ihrer Festplatte befinden, erkennt, kann sie 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). Also solltest du hier einen absoluten Pfad verwenden.

Eine alternative Lösung wäre, die Datei logging.properties in $JAVA_HOME/lib/ zu verschieben (oder bearbeiten Sie die Datei, die dort sein sollte). In diesem Fall müssen Sie keine Systemeigenschaft festlegen.

+0

Hallo, danke für die Antwort. Ich fange gerade mit Java an, also weiß ich nicht viel über das Verpacken etc. Ich habe ein NetBeans Standardprojekt mit einem Paket, das javaapplication genannt wird. Die Datei log.properties befindet sich jetzt im Standardpaket. So sieht meine Befehlszeile wie folgt: JavaApplication \ dist> javaw -Djava.util.logging.config.file = log.properties -jar JavaApplication.jar Die Eigenschaften noch Datei nicht geladen. Könnten Sie mir bitte einen zusätzlichen Hinweis geben? :) – abp

+0

Sind Sie sicher, dass es nicht geladen ist? "javaw" schluckt alle Ausgaben nach System.out und System.err. Versuchen Sie stattdessen "Java" (ohne "w"). Sie können auch versuchen, den Code zu debuggen, um zu sehen, warum er nicht protokolliert wird. Setzen Sie einfach einen Haltepunkt und "betreten" Sie den Protokollierungsaufruf (statt "übergehen"). log4j bietet eine Debug-Option, mit der die Konfiguration beim Lesen ausgedruckt wird. Ich weiß nicht, ob Sie das gleiche mit java.util.logging tun können. –

+0

Danke für die Antwort. Ich denke, ich bleibe bei der Laufzeitkonfiguration über eine Klasse, weil ich die Eigenschaftendatei nicht mit einem relativen Pfad laden kann. – abp

5

util logging lädt nicht aus dem classpath, es benötigt einen absoluten Pfad, weshalb andere Logging-Pakete wie log4j viel einfacher zu konfigurieren sind und besser für Web-Apps, wo es schwierig ist abs-Pfade zu bekommen.

Dies wird im java.util.logging.LogManager doco überhaupt nicht erklärt.

+0

(Jahre später, nach Jul ist endlich besser verstanden :-)) es erfordert sicherlich keinen _absolute_ Pfad; aber es _ist_ ein Dateipfad (relativ oder absolut); Als Alternative können Sie dem LogManager Eigenschaften einer Klasse hinzufügen (die aus dem Klassenpfad geladen werden, wie es zu erwarten wäre), anstatt sie aus einer Datei zu laden, indem Sie stattdessen '-Djava.util.logging.config.class = {class}' verwenden von '-Djava.util.logging.config.file = path/to/my.properties' Aber ich denke, jeder kann zustimmen, dass java.util.logging ein bisschen roh ist und dass --- log4j --- (update) slf4j + Logback ist einfacher zu konfigurieren und bessere Protokollierung Option – michael

44

Sie können java.util.logging Eigenschaftendateien sehr einfach von einem relativen Pfad laden. Dies ist, was ich in einen static {} Block in meiner Main Klasse einlege. Setzen Sie Ihre logging.properties Datei in die default package und Sie können sehr einfach mit dem folgenden Code darauf zugreifen.

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

Großartig, genau das, was ich gesucht und funktioniert wie ein Charme! – fxnn

Verwandte Themen