2016-10-04 109 views
1

我正在嘗試使用屬性對象配置log4j2版本2.5。這樣做的原因是從版本1.2.17遷移。我無法直接使用屬性文件。我們對它進行一些修改,以適應它。log4j2 -version 2.5 - 如何使用java.util.properties對象配置log4j2

這是我曾嘗試:

LogTest.java

public class LogTest { 

    static { 
      System.setProperty("log4j.configurationFactory",  "logsample.common.util.LogsampleConfigurationFactory"); 
    } 

    private static Logger logger =  LogManager.getLogger(LogTest.class.getName()); 

    public static void main(String[] args) throws Exception 
    { 
     logger.debug("First log"); 
     logger.info("Infoed"); 
    } 
} 

trace.properties

name = PropertiesConfig 

property.filename = D:/rolling/rollingtest.log 


appenders = file 


appender.file.type = File 
appender.file.name = LOGFile 
appender.file.fileName = ${filename} 
appender.file.layout.type = PatternLayout 
appender.file.layout.pattern = %d %p %C{1.} [%t] %m%n 


loggers = file 

logger.file.name = logware.common.util 
logger.file.level = debug 
logger.file.appenderRefs = file 
logger.file.appenderRef.file.ref = LOGFile 

LogwareConfigurationFactory.java

public class LogsampleConfigurationFactory extends ConfigurationFactory { 

    @Override 
    protected String[] getSupportedTypes() { 
     return new String[]{".properties", "*"}; 
    } 

    @Override 
    public Configuration getConfiguration(ConfigurationSource source) { 


     return new PropertiesConfiguration(createConfigurationSource(), null); 
    } 



    @Override 
    public Configuration getConfiguration(String name, URI configLocation) { 
     return new PropertiesConfiguration(createConfigurationSource(), null); 
    } 

    private ConfigurationSource createConfigurationSource() 
    { 
     Properties p = new Properties(); 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     InputStream in = null; 
     try { 
      p.load(new FileInputStream("D:/log4jSample/properties/trace.properties")); 

      p.store(out, null); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     in = new ByteArrayInputStream(out.toByteArray()); 

     ConfigurationSource configSrc = null; 
     try { 
      configSrc = new ConfigurationSource(in); 
     } 
     catch (IOException i) 
     { 

     } 
     return configSrc; 
    } 
} 

當我運行LogTest類,它無法使用空指針獲取LogContext。

異常堆棧

java.lang.ExceptionInInitializerError 
Caused by: java.lang.NullPointerException 
at org.apache.logging.log4j.core.config.builder.impl.BuiltConfiguration.<init>(BuiltConfiguration.java:58) 
at org.apache.logging.log4j.core.config.properties.PropertiesConfiguration.<init>(PropertiesConfiguration.java:36) 
at logware.common.util.LogwareConfigurationFactory.getConfiguration(LogwareConfigurationFactory.java:46) 
at org.apache.logging.log4j.core.config.ConfigurationFactory$Factory.getConfiguration(ConfigurationFactory.java:427) 
at org.apache.logging.log4j.core.config.ConfigurationFactory.getConfiguration(ConfigurationFactory.java:256) 
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:561) 
at org.apache.logging.log4j.core.LoggerContext.reconfigure(LoggerContext.java:578) 
at org.apache.logging.log4j.core.LoggerContext.start(LoggerContext.java:214) 
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:235) 
at org.apache.logging.log4j.core.impl.Log4jContextFactory.getContext(Log4jContextFactory.java:41) 
at org.apache.logging.log4j.LogManager.getContext(LogManager.java:167) 
at org.apache.logging.log4j.LogManager.getLogger(LogManager.java:522) 
at logware.common.util.LogTest.<clinit>(LogTest.java:58) 

因此,它是我沒有把在PropertiesConfiguration構造的rootComponent。但我不知道它應該是什麼。 這方面的任何指導或線索都會很好。

回答

2

2.5,我會建議你做:

@Override 
public Configuration getConfiguration(ConfigurationSource source) { 
    PropertiesConfigurationFactory factory = new PropertiesConfigurationFactory(); 
    return factory.getConfiguration(source); 
} 

在最新的版本,你將不得不修改該做的事:

@Override 
public Configuration getConfiguration(LoggerContext ctx, ConfigurationSource source) { 
    PropertiesConfigurationFactory factory = new PropertiesConfigurationFactory(); 
    return factory.getConfiguration(ctx, source); 
}