简体   繁体   中英

Log4j2 error on load XML configuration file

I'm trying to use an XML configuration file for Log4j2 that is embedded in my Java application, but is not working.

The code:

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

The error:

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)

You don't need to use the ConfigurationFactory when you use a XML-Configuration file. Just make sure your XML file is setup correctly.

Filename must be log4j2.xml

The file must me added to the classPath.

Get the logger with the right name in your applicaton, the same name you used to set up the logger in your xml-file, have a look here .

I had similar problem. Here is example that helped me: https://svn.apache.org/repos/asf/logging/log4j/log4j2/trunk/core/src/test/java/org/apache/logging/log4j/FormatterLoggerManualExample.java

In your case it should look like this:

URI configuration = Main.class.getResource("/in/gunbound/prelauncher/server/log4j2/log4j2.xml").toURI();
Configurator.initialize("config", null, configuration);

Had the same problem, solved it like this:

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

}

I'm currently using log4j2 beta 9 with a databaseAppender for writing into a ora db.

Shortest way (without creation of factory, source or url objects):

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

This works even if the configuration file is not named "log4j2.*".

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM