2012-09-25 12 views
9

Ich habe ein Eclipse-Java-Projekt, das log4j verwendet. Ich kann die log4j-Konfigurationsdatei nicht so einstellen, dass auf den Dateipfad zugegriffen wird. Ich muss das Projekt exportieren und in einem Glas ausführen.Wie log4j Eigenschaftendatei einstellen?

Hier ist, wie ich versuche:

public class Wita { 
    static Logger logger; 
    public static void main(String[] args) { 
    System.setProperty("log4j.configuration", new File("").getCanonicalPath()+File.separatorChar+"resources"+File.separatorChar+"log4j.xml"); 
    // System.out.println(System.getProperty("log4j.configuration")); 
    logger = Logger.getLogger(Wita.class.getName()); 
    } 
} 

-System heraus druckt die C: \ Benutzer \ roncsak \ eclipse_workspace \ WITA \ resources \ log4j.xml was gut ist. WITA ist der Basisordner des Projekts. Aber läuft das Projekt mit -Dlog4j.debug Argumente folgende Renditen auch:

 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using context classloader [email protected] 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using [email protected] class loader. 
log4j: Trying to find [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml] using ClassLoader.getSystemResource(). 
log4j: Could not find resource: [C:\Users\roncsak\eclipse_workspace\WITA\resources\log4j.xml]. 

Ich mag die log4j.xml im Laufe der Zeit ändern, ohne eine andere JAR-Datei zu bauen. Wie kann ich das machen?

Antwort

18

Von "Standardinitialisierung Procedure" bei http://logging.apache.org/log4j/1.2/manual.html:

  • die Ressource String-Variable auf den Wert der log4j.configuration Systemeigenschaft. Die Standardinitialisierungsdatei wird am besten über die Eigenschaft log4j.configuration angegeben. Wenn die Systemeigenschaft log4j.configuration nicht definiert ist, setzen Sie die Variable der Zeichenfolgenressource auf den Standardwert "log4j.properties".
  • Es wurde versucht, die Ressourcenvariable in eine URL zu konvertieren.
  • Wenn die Ressourcenvariable nicht auf eine URL umgewandelt werden können, beispielsweise durch zu einem MalformedURLException, dann von der durch Classpath für die Ressource suchen org.apache.log4j.helpers.Loader.getResource (Ressource aufrufen, Logger. Klasse) , die eine URL zurückgibt. Beachten Sie, dass die Zeichenfolge "log4j.properties" eine fehlerhafte URL darstellt. Eine Liste der gesuchten Orte finden Sie unter Loader.getResource (java.lang.String) .

So müssen Sie file:-log4j.configuration Eigenschaftswert um vorangestellt, dass es als URL behandelt werden kann.

Siehe https://stackoverflow.com/a/7927278/603516.

Noch besser Code:

System.setProperty("log4j.configuration", new File("resources", "log4j.xml").toURL()); 
+0

Und es funktioniert! Vielen Dank! – roncsak

+4

'java.io.File.toURL()' ist jetzt veraltet. Stattdessen verwende: 'x.toURI(). ToURL()' – kevinarpe

+0

Es funktioniert perfekt, nur eine "Datei:" kostet mich einen ganzen Morgen, ich möchte dich küssen. – BenBen

5

Sie können VM Argument gesetzt: -Dlog4j.configuration='path_to_log4j.xml'

oder programmatisch:

String logFilePath = new File(<path_to_log4j.xml>); 
if (logFilePath == null || "".equalsIgnoreCase(logFilePath)) { 
    URL file = this.getClass().getResource(DEFAULT_CONF); 
    DOMConfigurator.configure(file); 
} else { 
    DOMConfigurator.configure(<default_config_file>); 
} 
0

All diese oben Antwort nicht zufrieden stellen, so hier für jemanden, den ich schreibe, die könnten dies in Zukunft benötigt:

  1. Sie müssen angeben, wo Sie Ihre Immobilie ist. Entweder per Programm oder Befehlsoption ist in Ordnung.

Programatically:

private static void setupLog4J(){ 
    try { 
     System.setProperty("log4j.configuration", new File(".", File.separatorChar+"log4j.properties").toURL().toString()); 
    } catch (MalformedURLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 
  1. Ihre eigene log4j.properties Datei erstellen:

# Logging level 
# Root logger option 
log4j.rootLogger=DEBUG, stdout, file 

# Redirect log messages to console 
log4j.appender.stdout=org.apache.log4j.ConsoleAppender 
log4j.appender.stdout.Target=System.out 
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout 
log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p  %c{1}:%L - %m%n 

# Redirect log messages to a log file, support file rolling. 
log4j.appender.file=org.apache.log4j.RollingFileAppender 
log4j.appender.file.File=c:/project/resources/t-output/log4j-application.log 
log4j.appender.file.MaxFileSize=5MB 
log4j.appender.file.MaxBackupIndex=10 
log4j.appender.file.layout=org.apache.log4j.PatternLayout 
log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n 

Hoffnung, das hilft.