简体   繁体   中英

LOG4J2 Use multiple config files using java

can log4j2 use multiple config files. I wanna run my project and load one default config file - logger.xml and after that to check if there is a second configuration from another file logger_1.xml and to add it and not to override the first one. Here is some dummy code. In short I wanna fill up the arrayList with file paths and then to load all of them.

  public class LoggerConfiguratorManager
{
public static final String LOG4J_PATH = "etc/confs/logger.xml";

  private static LoggerContext context = null;
  private static final ConfigurationFactory factory =  XmlConfigurationFactory.getInstance();
  private static ConfigurationSource configurationSource = null;
  private static Configuration configuration = null;
  private static final ArrayList<String> registred_logger = new ArrayList<>();

  private static void loadLoggerConfig(String logger_path)
  {
    InputStream is = null;
    try
    {
      if(logger_path.endsWith(".xml"))
        is = new FileInputStream(logger_path);
      else
      {
        final ZipFile archive = new ZipFile(logger_path);
        final ZipEntry logger_entry = archive.getEntry(LOG4J_PATH);
        if(logger_entry == null) throw new IOException("Cannot find 'logger.xml' in " + logger_path);
        is = archive.getInputStream(logger_entry);
      }

      configurationSource = new ConfigurationSource(is);
      configuration = factory.getConfiguration(configurationSource);
    }
    catch(IOException ex)
    {
      System.err.println("=============================================================================");
      System.err.println("=============================== LOGGER CONFIG ===============================");
      System.err.println("=============================================================================");
      System.err.println("=== [ERROR] " + ex);
    }
    finally
    {
      if (configurationSource != null)
      {
        context = Configurator.initialize(null, configurationSource);
        context.start(configuration);
        try { is.close(); } catch(IOException ex) { }
      }
    }
  }

  public static void load()
  {
    registred_logger.add(Globals.getClassLocation(LoggerConfiguratorManager.class));

    for(final String conf : registred_logger)
      loadLoggerConfig(conf);
  }

  public static void regLoggerConf(String conf_path) { registred_logger.add(conf_path); }

I would suggest doing instead:

  public class LoggerConfiguratorManager {

     private static final String LOG4J_PATH = "etc/confs/log4j2.xml";
     private static final StringBuffer paths = new StringBuffer(LOG4J_PATH);

     public static void registerConfiguration(String confPath) {
         paths.append(",").append(confPath);
     }

     public static void initLog4j() {
         Configurator.initializer("My Config", null, paths.toString(), null);
     }
  }

For a full working example please see https://github.com/rgoers/CompositeConfigurationExample .

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