2010-02-18 16 views
21

Wie bekomme ich log4j, um eine Eigenschaftendatei abzurufen.So konfigurieren Sie log4j mit einer Eigenschaftendatei

Ich schreibe eine Java-Desktop-App, die ich log4j verwenden möchte. In meiner Haupt-Methode, wenn diese haben:

PropertyConfigurator.configure("log4j.properties"); 

Die log4j.properties-Datei im selben Verzeichnis befindet, wenn ich das Glas öffnen.

Dennoch bekomme ich diesen Fehler:

log4j:ERROR Could not read configuration file [log4j.properties]. java.io.FileNotFoundException: log4j.properties (The system cannot find the file specified)

Was mache ich falsch?

+1

Die Datei log4j.properties muss sich im Stammordner Ihrer Hauptanwendung befinden (da Sie eine Desktopanwendung schreiben). –

Antwort

43

Ich glaube, dass die Configure-Methode einen absoluten Pfad erwartet. Wie auch immer, können Sie auch versuchen, eine Eigenschaft erstes Objekt zu laden:

Properties props = new Properties(); 
props.load(new FileInputStream("log4j.properties")); 
PropertyConfigurator.configure(props); 

Wenn die Eigenschaften-Datei in dem Glas ist, dann könnte man so etwas tun:

Properties props = new Properties(); 
props.load(getClass().getResourceAsStream("/log4j.properties")); 
PropertyConfigurator.configure(props); 

Die oben geht davon aus, dass die log4j .properties befindet sich im Stammordner der JAR-Datei.

+0

Ein absoluter Pfad im Jar oder im Dateisystem? – Dan

+0

Ein absoluter Pfad im Dateisystem. Verwenden Sie getResource, wenn sich die Datei im Jar befindet. – kgiannakakis

+0

Hast du ein Beispiel, wie man das macht? – Dan

-1

Sie können log4j interne Protokollierung aktivieren, indem Sie die Variable 'log4j.debug' definieren.

+1

Beantwortet die ursprüngliche Frage nicht. – Achow

+0

@anirbanchowdhury Nein, aber es ist eine wertvolle Alternative, die dokumentiert werden sollte. Aber verschwenden Sie Ihren Ruf auf Downgrades ... Sie haben nur ein paar hundert Millionen zu gehen! – Jeach

+0

Es ist nicht persönlich, aber ich verstehe völlig, warum Leute nach dem Downgrade nicht kommentieren. :) – Achow

1

Ich habe diesen Code in meiner Anwendung heute

File log4jfile = new File("./conf/log4j.properties"); 
PropertyConfigurator.configure(log4jfile.getAbsolutePath()); 

Der relative Pfad ist aus dem Arbeitsverzeichnis der JVM (wo die JVM startet).

12

Wenn Sie PropertyConfigurator.configure (String konfigurations), sie die folgende Operation in der log4j Library.

Properties props = new Properties(); 
FileInputStream istream = null; 
try { 
    istream = new FileInputStream(configFileName); 
    props.load(istream); 
    istream.close(); 
} 
catch (Exception e) { 
... 

Es schlägt fehl, beim Lesen, weil es für „Log4j.properties“ aus dem aktuellen Verzeichnis sucht, wo die Anwendung ausgeführt wird.

Wie ändert es den Leseteil der Eigenschaftendatei wie folgt und setzt "log4j.properties" in das Verzeichnis, in dem der CLASSPATH festgelegt ist.

ClassLoader loader = Thread.currentThread().getContextClassLoader(); 
URL url = loader.getResource("log4j.properties"); 
PropertyConfigurator.configure(url); 

Eine andere Methode der "Log4j.properties" in der JAR-Datei setzen existiert.

jar xvf [YourApplication].jar log4j.properties 
0

Ich glaube, das log4j.properties-Verzeichnis muss es im Java-Klassenpfad sein. In Ihrem Fall sollte das Hinzufügen der CWD zum Klassenpfad funktionieren.

0

Da JVM Argumente werden schließlich auf Ihr Java-Programm als Systemvariablen übergeben, können Sie diesen Code am Anfang Ihres Ausführungspunkt verwenden, um die Eigenschaft zu bearbeiten und haben log4j die Eigenschaft lesen Sie gerade in Systemeigenschaften setzen

try { 
     System.setProperty("log4j.configuration", new File(System.getProperty("user.dir")+File.separator+"conf"+File.separator+"log4j.properties").toURI().toURL().toString()); 
    } catch (MalformedURLException e) { 
     e.printStackTrace(); 
    } 
3

Dies ist eine Bearbeitung der Antwort von @kkiannakakis: Der ursprüngliche Code ist falsch, weil es den InputStream nicht korrekt schließt, nachdem Properties.load(InputStream) aufgerufen wird. Vom Javadocs: The specified stream remains open after this method returns.

================================

glaube ich, dass das configure Methode erwartet einen absoluten Pfad. Wie auch immer, können Sie auch versuchen, eine Eigenschaft erstes Objekt zu laden:

Properties props = new Properties(); 
InputStream is = new FileInputStream("log4j.properties"); 
try { 
    props.load(is); 
} 
finally { 
    try { 
     is.close(); 
    } 
    catch (Exception e) { 
     // ignore this exception 
    } 
} 
PropertyConfigurator.configure(props); 

Wenn die Eigenschaften-Datei in dem Glas ist, dann könnte man so etwas tun:

Properties props = new Properties(); 
InputStream is = getClass().getResourceAsStream("/log4j.properties"); 
try { 
    props.load(is); 
} 
finally { 
    try { 
     is.close(); 
    } 
    catch (Exception e) { 
     // ignore this exception 
    } 
} 
PropertyConfigurator.configure(props); 

Die oben geht davon aus, dass die log4j .properties befindet sich im Stammordner der JAR-Datei.

5

nur gesetzt -Dlog4j.configuration = Datei: log4j.properties arbeitete für mich.

log4j sucht dann nach der Datei log4j.properties im aktuellen Arbeitsverzeichnis der Anwendung.

Denken Sie daran, dass log4j.configuration ist ein URL Spezifikation, so fügen ‚file:‘ vor Ihrem log4j.properties Dateinamen, wenn Sie in eine reguläre Datei auf dem Dateisystem beziehen möchten, dh eine Datei nicht auf dem Classpath !

Zunächst habe ich -Dlog4j.configuration = log4j.properties angegeben. Dies funktioniert jedoch nur, wenn sich log4j.properties im Klassenpfad befindet. Wenn ich log4j.properties in mein Projekt in main/resources kopierte und neu erstellte, so dass es in das Zielverzeichnis (maven project) kopiert wurde, funktionierte das genauso gut (oder Sie könnten Ihre log4j.properties in Ihre Projektfenster packen) erlauben Sie dem Benutzer, die Loggerkonfiguration zu bearbeiten!).

Verwandte Themen