2013-02-11 11 views
5

Sto cercando di utilizzare un file di configurazione XML per Log4j2 incorporato nella mia applicazione Java, ma non funziona.Errore log4j2 sul caricamento del file di configurazione XML

Il codice:

ConfigurationSource source = new ConfigurationSource(Main.class.getResourceAsStream("/in/gunbound/prelauncher/server/log4j2/log4j2.xml")); 
ConfigurationFactory factory = (ConfigurationFactory) XMLConfigurationFactory.getInstance().getConfiguration(source); 
ConfigurationFactory.setConfigurationFactory(factory); 

L'errore:

Exception in thread "main" java.lang.ClassCastException: org.apache.logging.log4j.core.config.XMLConfiguration cannot be cast to org.apache.logging.log4j.core.config.ConfigurationFactory at in.gunbound.prelauncher.server.Main.main(Main.java:62)

risposta

2

Non è necessario utilizzare il ConfigurationFactory quando si utilizza un file XML di configurazione. Assicurati che il tuo file XML sia configurato correttamente.

nome del file deve essere log4j2.xml

Il file deve mi aggiunto al classpath.

Ottieni il programma di registrazione con il nome corretto nell'applicativo, lo stesso nome utilizzato per configurare il registratore nel file xml, avere un look here.

+0

L'aggiunta di un file a classpath non è sempre "facile", ad es. se crei un'applicazione desktop con javapackager, ottieni ad es. un file .exe che avvia l'applicazione. Per i "normali" programmi java avviati con 'java -jar' è più semplice (anche in questi casi la configurazione del logger di solito si trova in una cartella accanto al jar, nel qual caso il manifest jar può descrivere il classpath. javapackager ha creato installazioni di installazione per programmare i file, non è possibile modificare il file conf di log4j se non si è admin) –

2

aveva lo stesso problema, risolto in questo modo:

import java.io.InputStream; 

import org.apache.logging.log4j.LogManager; 
import org.apache.logging.log4j.Logger; 
import org.apache.logging.log4j.core.LoggerContext; 
import org.apache.logging.log4j.core.config.Configuration; 
import org.apache.logging.log4j.core.config.ConfigurationFactory.ConfigurationSource; 
import org.apache.logging.log4j.core.config.XMLConfigurationFactory; 

public class Log 
{ 

    private Logger logger; 

    public Log(String name) 
    { 
     InputStream is = Application.class.getResourceAsStream("log-config.xml"); 
     ConfigurationSource source = new ConfigurationSource(is); 
     Configuration config = XMLConfigurationFactory.getInstance().getConfiguration(source); 
     LoggerContext ctx = (LoggerContext) LogManager.getContext(true); 

     ctx.stop(); 
     ctx.start(config); 

     logger = ctx.getLogger(name); 
    } 

    public Logger getLog() 
    { 
     return logger; 
    } 

} 

Attualmente sto usando log4j2 beta 9 con un databaseAppender per scrivere in un ora db.

0

via più breve (senza creazione di fabbrica, sorgente o oggetti URL):

Configurator.initialize("configName", "logging.xml"); 

Questo funziona anche se il file di configurazione non viene nominato "log4j2 *".

Problemi correlati