2012-09-25 19 views
9

Possiedo un progetto Java Eclipse che utilizza log4j. Non riesco a impostare il file di configurazione log4j a cui accedere per il percorso del file. Devo esportare ed eseguire il progetto in un barattolo.Come impostare il file delle proprietà di log4j?

ecco come lo provando:

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

sistema fuori stampa i C: \ Users \ roncsak \ eclipse_workspace \ WITA \ Resources \ log4j.xml che è buono. WITA è la cartella di base del progetto. Ma l'esecuzione del progetto con -Dlog4j.debug argomento delle seguenti dichiarazioni anche:

 
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]. 

Vorrei cambiare il log4j.xml nel tempo, senza la costruzione di un altro file jar. Come lo posso fare?

risposta

18

Da "Procedura di inizializzazione di default" a http://logging.apache.org/log4j/1.2/manual.html:

  • Impostare la variabile stringa di risorsa al valore della proprietà di sistema log4j.configuration. Il modo preferito per specificare il file di inizializzazione predefinito è tramite la proprietàdel sistema log4j.configuration. Nel caso in cui la proprietà di sistema log4j.configuration non sia definita, impostare la risorsa variabile di stringa sul valore predefinito "log4j.properties".
  • Tentativo di convertire la variabile di risorsa in un URL.
  • Se la variabile risorsa non può essere convertito in un URL, ad esempio a causa ad un MalformedURLException, quindi cercare la risorsa dal classpath chiamando org.apache.log4j.helpers.Loader.getResource (risorse, Logger. classe) che restituisce un URL. Si noti che la stringa "log4j.properties" costituisce un URL non valido. Vedere Loader.getResource (java.lang.String) per l'elenco delle posizioni ricercate.

quindi è necessario anteporre file:-log4j.configuration valore della proprietà in modo che esso può essere trattato come URL.

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

Ancora codice migliore:

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

E funziona! Grazie mille! – roncsak

+4

'java.io.File.toURL()' è ora obsoleto. Usa invece: 'x.toURI(). ToURL()' – kevinarpe

+0

Funziona perfettamente, solo un "file:" mi è costato un'intera mattinata, voglio baciarti amico. – BenBen

5

È possibile impostare VM argomento: -Dlog4j.configuration='path_to_log4j.xml'

o programatically:

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

Tutti questi risposta di cui sopra non ha soddisfatto così ho posto qui per qualcuno che potrebbe bisogno di questo in futuro:

  1. È necessario specificare dove la tua proprietà è. O per programma o opzione di comando va bene.

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. creare il proprio file log4j.properties:

# 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 

Spero che questo aiuti.

Problemi correlati