Hi,
While upgrading from 1.2.17 to 2.5, I have come across a major difference.
Please see following code snippets.
Log4j1.2.17
private static final Logger LOGGER = Logger.getLogger(TestLog.class);
public static void main(String args[])
{
Properties p = new Properties();
p.setProperty("log4j.debug","true");
p.setProperty("log4j.rootLogger","info,cfg");
p.setProperty("log4j.appender.cfg","org.apache.log4j.ConsoleAppender");
p.setProperty("log4j.appender.cfg.layout","org.apache.log4j.PatternLayout");
PropertyConfigurator.configure(p);
LOGGER.info("INFO"); //logs on console
LOGGER.warn("warn"); //logs on console
LOGGER.error("error"); //logs on console
}
Log4j2 v2.5
private static final Logger LOGGER = LogManager.getLogger(TestLog.class);
public static void main(String[] args)
{
PropertiesConfigurationFactory factory = new
PropertiesConfigurationFactory(); // This line and the try catch below
replace the
Properties cfg = new Properties();
cfg.setProperty("name", "config");
cfg.setProperty("status", "debug");
cfg.setProperty("appenders","console");
cfg.setProperty("appender.console.type","Console");
cfg.setProperty("appender.console.name","Console");
cfg.setProperty("appender.console.layout.type","PatternLayout");
cfg.setProperty("rootLogger.level","info");
cfg.setProperty("rootLogger.appenderRefs","console");
cfg.setProperty("rootLogger.appenderRef.console.ref","Console");
try {
ConfigurationSource configSrc = createConfigurationSource(cfg);
//PropertyConfigurator.configure(cfg); from log4j1.2
Configuration conf = factory.getConfiguration(configSrc);
System.setProperty("Log4jContextSelector",
"org.apache.logging.log4j.core.selector.BasicContextSelector");
LoggerContext ctx = Configurator.initialize(conf);
ContextAnchor.THREAD_CONTEXT.set(ctx);
}
catch (IOException io)
{
}
LOGGER.info("INFO"); // does not print
LOGGER.warn("warn"); // does not print
LOGGER.error("error"); //prints to console
}
private static ConfigurationSource createConfigurationSource(Properties
cfg) throws IOException {
ByteArrayOutputStream out = new ByteArrayOutputStream();
cfg.store(out, null);
InputStream in = new ByteArrayInputStream(out.toByteArray());
return new ConfigurationSource(in);
}
}
So, In log4j2 , the Logger which is initialized as private static final, is not
aware of the configurations, but in logj1.x, It is.
Is there any way to make log4j2 code behave as log4j1.x did?
Best Regards,
Tarun