2012-09-25 9 views
9

J'ai un projet Java Eclipse qui utilise log4j. Je ne peux pas définir le fichier de configuration log4j auquel accéder par chemin de fichier. Je dois exporter et exécuter le projet dans un pot.Comment configurer le fichier de propriétés log4j?

Voici comment j'essayer:

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

système imprime sur les C: \ Users \ roncsak \ eclipse_workspace \ WITA \ ressources \ log4j.xml ce qui est bon. WITA est le dossier de base du projet. Mais l'exécution du projet avec -Dlog4j.debug l'argument les rendements suivants:

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

Je voudrais changer le log4j.xml au fil du temps, sans construire un autre fichier jar. Comment puis je faire ça?

Répondre

18

A partir de "défaut Procédure d'initialisation" à http://logging.apache.org/log4j/1.2/manual.html:

  • Réglez la valeur de la variable de type chaîne de ressources de la propriété système log4j.configuration . La manière préférée de spécifier le fichier d'initialisation par défaut est via la propriété du système log4j.configuration. Dans le cas où la propriété système log4j.configuration n'est pas définie, définissez la variable de ressource de chaîne sur sa valeur par défaut "log4j.properties".
  • Essayez de convertir la variable de ressource en URL.
  • Si la variable ressource ne peut être converti en une URL, par exemple en raison à un MalformedURLException, alors à la recherche de la ressource de la classpath en appelant org.apache.log4j.helpers.Loader.getResource (ressources, Logger. class) qui renvoie une URL. Notez que la chaîne "log4j.properties" constitue une URL mal formée. Voir Loader.getResource (java.lang.String) pour la liste des emplacements recherchés.

Vous devez préfixer file:-log4j.configuration valeur de la propriété afin qu'elle puisse être traitée comme URL.

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

Encore mieux code:

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

Et ça marche! Merci beaucoup! – roncsak

+4

'java.io.File.toURL()' est maintenant obsolète. Au lieu de cela, utilisez: 'x.toURI(). ToURL()' – kevinarpe

+0

Cela fonctionne parfaitement, juste un "fichier:" m'a coûté une matinée entière, je veux vous embrasser mec. – BenBen

5

Vous pouvez définir l'argument VM: -Dlog4j.configuration='path_to_log4j.xml'

ou 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

Toutes ces réponses ci-dessus n'a pas satisfait donc je posterai ici pour quelqu'un qui a besoin pourrait à l'avenir:

  1. Vous devez spécifier où votre propriété est. Soit par le programme ou l'option de commande est bien.

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. Créez votre propre fichier 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 

Hope this helps.

Questions connexes